鉴于自动属性编译为 get_method、set_method 和私有变量,并且由于 C# 8 引入了默认接口方法
接口中的属性可以有默认实现吗?
特别是只获得财产?
鉴于自动属性编译为 get_method、set_method 和私有变量,并且由于 C# 8 引入了默认接口方法
接口中的属性可以有默认实现吗?
特别是只获得财产?
不。
该提案说:
接口可能不包含实例状态。虽然现在允许使用静态字段,但接口中不允许使用实例字段。接口不支持实例自动属性,因为它们会隐式声明隐藏字段。
(来源)
另请参阅第 9 频道采访Mads Torgersen 的 C# 8 预览,他们在其中讨论了默认接口实现等。
默认接口方法不包含在随 Visual Studio 2019 Preview 1 一起发布的 C# 8.0(测试版)中。在撰写本文时,默认接口方法原型仍在开发中。请参阅Champion“默认接口方法”。
是的。
自动属性不是特殊类型的属性。它们是一种便利功能,可生成在支持字段中存储属性值所需的代码。
您可以为 getter 和 setter 指定属性的默认实现。您可以在Sharplab.io中尝试以下代码
public interface IDimensions
{
int Height {get;set;}
int Width {get;set;}
int Depth {get;set;}
int Weight { get=>0; set{} }
int Density { get=> Weight==0?0:Height*Width*Depth/Weight ; }
}
public class Box:IDimensions
{
public int Height{get;set;}
public int Width{get;set;}
}
版本控制
这演示了版本控制方案。Box
实现了一个IDimensions
仅包含Height
,的版本Width
。
Weight
后来添加了一个默认实现,该实现返回 0 并忽略写入。Density
添加了一个默认实现,该实现返回一个盒子的体积/密度,如果没有有效的重量,则为 0。Box
即使 interfade 改变了,也不必改变。甚至编译器生成的代码也没有显示对Box
类的任何更改。
类可以用它们自己的替换默认实现。没有什么能阻止将来Box
添加int Weight {get;set;}
。
默认实现只能通过接口获得:
IDimensions box=new Box();
Console.WriteLine(box.Density);
性状
默认实现处理的另一个场景是特征。
假设我想将IDensity
特征添加到任何类型的项目。在大多数情况下,我只需要一个项目的体积和重量来计算它的密度:
public interface IDensity
{
int Density
{
get
{
var weight=getWeight();
if (weight==0) return 0;
return getVolume()/weight;
}
}
abstract int getWeight();
abstract int getVolume();
}
此特征将返回一个简单的密度计算并强制应用它的类型来实现 int getWeight()
和int getHeight()
方法:
public class Crate:IDensity
{
//Dummy numbers
public int getWeight()=>55;
public int getVolume()=>100;
}
public class C {
public void M() {
IDensity box=new Cake();
Console.WriteLine(box.Density);
}
}
另一个容器可以用自己的实现覆盖该实现。也许容器有一个复杂的形状:
public class WeddingCake:IDensity
{
public int getWeight()=>5;
public int getVolume()=>getWeight()/Density;
public int Density=>2;
}
此示例的 Sharplab.io 链接在这里