您认为“自动接口实现”在 .NET / C# 中有用吗?

2023-11-22

考虑一下:

public class interface Person : IPerson
{
  int ID { get; protected set; }
  string FirstName { get; set; }
  string LastName { get; set; }
  string FullName { get { return FirstName + " " + LastName; } }
}

和这个:

public class StubPerson : IPerson
{
    int ID { get { return 0; protected set { } }
    string FirstName { get { return "Test" } set { } }
    string LastName { get { return "User" } set { } }
    string FullName { get { return FirstName + " " + LastName; } }
}

Usage:

IPerson iperson = new Person();

Or:

IPerson ipersonStub = new StubPerson();

Or:

IPerson ipersonMock = mocks.CreateMock<IPerson>();

所以实际上我们正在宣布IPerson接口和Person同时上课:

public class interface Person : IPerson

您认为在 .NET/C# 中提供这种支持有用吗?

Edit:

由于大量混乱,我认为我需要澄清拟议的目的:

如果没有这个功能,你将不得不编写:

interface IPerson
{
  int ID { get; }
  string FirstName { get; set; }
  string LastName { get; set; }
  string FullName { get; }
}

还有这个:

public class Person : IPerson
{
  int ID { get; protected set; }
  string FirstName { get; set; }
  string LastName { get; set; }
  string FullName { get { return FirstName + " " + LastName; } }
}

我根本不提议任何语义改变。


让我看看我是否明白你在问什么:

为什么我们不能声明一个接口:

interface IPerson
{
    string Name {get;set;}
    int ID {get;set;}
}

实现该接口的类将继承其属性,而无需重新声明它们:

class Person : IPerson { } 
//person now has properties Name and ID

你不能这样做的原因是,即使你的接口代码和你的类代码的文本非常相似,它们意思是非常不同的东西。该接口只是简单地说“实现者将有一个带有 getter 和 setter 的字符串名称”。该类表示“调用名称的 getter 时返回私有字段”。即使您使用自动属性快捷方式让编译器实现该逻辑,它仍然是logic,属于该类。只因为:

string Name {get;set;}

looks在接口和类中相同,但并不意味着完全一样。

对于编译器来说,实现任意逻辑来为您履行合同而不是在编译时抱怨您尚未实现它们是非常危险的。它可能会引入很难追踪的错误。当没有定义行为时让编译器回退到默认行为是一个非常非常糟糕的主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您认为“自动接口实现”在 .NET / C# 中有用吗? 的相关文章

  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 什么可以解释托管堆上超过 5,000,000 个 System.WeakReference 实例?

    我一直在针对生产 ASP NET Web 应用程序运行负载测试 并且看到在堆上创建了大量 System WeakReference 在大约 15 分钟内 负载管理堆内存已飙升至大约 3GB 并且我有大约 5 000 000 个对 Syste
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver

随机推荐

  • 测量docker容器的执行时间

    我有一个名为my image启动命令并关闭 使用命令在容器中运行图像时docker run rm my image 是否可以测量容器的执行时间 Edit 我需要在容器执行后查看这些计时信息 因此我无法使用time命令 我以某种方式希望找到
  • 如何统计java中执行的字节码数量

    我要参加麻省理工学院的战斗代码竞赛 参赛者编写程序来控制互相战斗的机器人 问题是你的机器人每次只能执行一定数量的字节码 去年是每轮 10000 个 现在 一个简单的循环 喜欢 int i 0 i lt 100 i do nothing 根据
  • 在 C++ 中,类模板的显式特化定义应该放在哪里?

    根据 温度规格 5 对于给定的模板和给定的一组模板参数 一个明确的专业化在程序中最多定义一次 根据 基本 def odr and 类模板的显式 完整 特化的定义不能放在标头中 否则包含该标头的每个翻译单元中都有一个定义 因此整个程序中将有多
  • 如何在(子)模块中使用 __init__.py 定义命名空间?

    我的问题是关于编写 Python 3 x 包和 子 模块以及正确使用 init py文件来声明命名空间 我曾经用 C 编写代码 所以我喜欢使用很多单独的文件来组织项目 例如 imo 如果一个模块包含多个类 则每个类都应该位于单独的文件中 由
  • 安装和更新 Perl 模块为“通用”(x86_64、arm64)?

    是否可以安装和更新具有通用 x86 64 arm64 架构支持的 Perl CPAN 模块 如果是 那么如何 背景 在基于arm的macOS计算机上 可以为一个指定的架构安装Perl CPAN模块 如下所示 sudo cpan i Enco
  • WebStorm 和 PHPStorm 的区别

    我正在选择一个用于 Web 开发的 IDE 我想知道 WebStorm 和 PHPStorm 之间的区别是什么 我在 JetBrains 的网站上找不到任何要点 甚至 Google 也没有多大帮助 我现在所知道的是 PHPStorm 不像
  • 内联函数中的静态变量

    我有一个在头文件中声明和定义的函数 这本身就是一个问题 当该函数未内联时 使用该标头的每个翻译单元都会获得该函数的副本 并且当它们链接在一起时会出现重复 我通过使函数内联来 修复 这个问题 但恐怕这是一个脆弱的解决方案 因为据我所知 编译器
  • Scala Futures - 内置超时?

    我从官方教程参考文献中无法完全理解 futures 的一个方面 http docs scala lang org overviews core futures html scala 中的 future 是否有某种内置的超时机制 假设下面的示
  • 大量列的性能下降。派斯帕克

    我在处理 Spark 宽数据帧 大约 9000 列 有时更多 时遇到了问题 Task 通过groupBy和pivot创建宽DF 将列转换为向量并从 pyspark ml 处理为 KMeans 所以我制作了广泛的框架并尝试使用 VectorA
  • 如何使用 Visual Studio 2005 / resharper 自动向文件夹、命名空间或项目中的每个文件添加“using”语句

    我正在使用 resharper 进行大型重构 并且我不断从一个文件到另一个文件 并在 使用 部分中一遍又一遍地添加相同的名称空间 是否有办法向文件夹 命名空间或项目中的每个文件添加 using 语句 尽管有些文件不需要参考 但大多数文件都需
  • 使用 CriteriaBuilder 在 Java 中获取列表的 IllegalStateException

    总结一下 我有 3 个实体 主要的一个是名为 Rac 的实体 它包含 RacNatureza 列表 其中包含属性 Natureza Rac Entity Table name rac public class Rac Id Generate
  • authenticateWithCompletionHandler: 已弃用:首先在 iOS 6.0 中弃用

    我正在开发使用 Game Center 的游戏 我收到下一个警告 authenticateWithCompletionHandler 已弃用 首先在 iOS 6 0 中弃用 好吧 我搜索了一下 发现有新的代码用于验证本地用户 所以我更换了
  • 为什么不将 IGNORE_DUP_KEY 设置为 ON?

    IGNORE DUP KEY ON基本上告诉 SQL Server 插入非重复行 但默默地忽略任何重复项 默认行为是当列中存在不允许的重复项时引发错误并中止整个事务 我处理过大量数据 这些数据通常至少有一个重复项 而实际上不应该有 所以我喜
  • 将具有多个参数的函数与“map”一起使用

    我正在尝试将一个带有 2 个参数的函数映射到一个列表 my func lambda index value value upper if index 2 else value lower import string alphabet str
  • 如何使用 angularjs $resource 进行服务器端分页?

    我正在尝试显示一个包含大量元素集合的表格 我想对表格进行分页并仅加载当前页面上显示的元素 现在 json 已加载 resource I read here在 json 标头中传递分页信息 currentPage pagesCount 和 e
  • 如何动态获取Spring Boot应用程序jar父文件夹路径?

    我有一个 Spring Boot Web 应用程序 我使用它运行java jar 应用程序 jar 我需要从代码中动态获取 jar 父文件夹路径 我怎样才能做到这一点 我已经尝试过了this 但没有成功 嗯 对我有用的是改编这个答案 代码是
  • 如何更改超链接点击后的颜色[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我想在单击超链接后更改其颜色 但是剩余的超链接颜色也发
  • 解析单例时获取 DbContext

    Within ConfigureServices I have services AddDbContext
  • Bootstrap 4.0 无效反馈不显示

    我正在使用 Bootstrap 4 0 非测试版 验证 并且在显示无效反馈文本时遇到问题 div class form row div
  • 您认为“自动接口实现”在 .NET / C# 中有用吗?

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 考虑一下 public c