c# - 在 c# 接口中设置属性中的实现细节
问题描述
我是 C# 的新手。我已经浏览了接口并知道接口内部只允许使用属性和方法,因为它们不应该包含任何实现细节。我还知道,即使在 c# 中允许使用属性,它们也不会生成支持字段,不像在班上。困扰我的是 c# 编译器允许我编写这个接口:
interface IPrinter {
int printCount {
get {
return printCount;
}
set {
Console.WriteLine("Your text:");
}
}
}
我什至可以执行它。有人可以纠正我对为什么 c# 不限制我在接口中的实现的理解吗?
解决方案
您指的是 C#8 中的一个特性:接口的默认实现,现在只是一个草案。使用此功能,您可以在接口本身内实现,而无需实际创建具体类。不过,根据我的理解,这归结为类似于具有接口名称的抽象基类。
截至此功能的规格:
接口可能不包含实例状态。虽然现在允许使用静态字段,但接口中不允许使用实例字段。
在您的情况下,您没有任何state。这printCount
是一个属性,而不是一个字段。特别是您的属性没有任何支持字段,它所做的只是调用一个static
方法(以及您的 getter 中的无限递归导致StackOverlowException
运行时的 a,顺便说一句。)。
因此,除非您没有在接口中引入某种状态(根据规范,这是通过引用实例字段),否则您可以在默认实现中进行任何您想要的操作。
推荐阅读
- javascript - 如何立即更新子组件中的父状态
- salesforce - 无法在 SFCC Demandware 中保存用户选择的选项列表值
- c++ - 在 Linux 上将正在运行的应用程序中的共享对象热更新到新版本
- javascript - Cordova webview + 角度
- java - Spring Boot JPA:GetRequest 没有输出
- spring-boot - Spring Boot REST Api中的一对多关系
- javascript - 在参数链接中添加随机值
- azure - 如何在 Azure SSAS 上部署多维数据集(XMLA 格式)
- arrays - 简化 C 中的大量数组声明
- python - 我们是否需要通过来自对象检测模型的所有检测或基于置信度阈值的过滤检测来计算 mAP?