"自动特性"的默认接口方法和默认值



给定一个auto属性编译为get_methodset_method和私有变量,并且由于C#8引入了默认接口方法

接口中的属性可以有默认实现吗?

尤其是一处只买不到的房产?

否和是。接口不能具有状态,但可以使用{get;set;}定义属性。

自动属性不是一种特殊类型的属性。它们是一个方便的功能,可以生成在后台字段中存储属性值所需的代码。

您可以为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;}
public int Depth {get;set;}
}

版本控制

这演示了版本控制场景。Box实现了仅包括HeightWidthIDimensions的版本。

Weight后来添加了一个默认实现,该实现返回0并忽略写入。Density添加了一个默认实现,该实现返回盒子的体积/密度,如果没有有效的权重,则返回0。Box不必改变,即使宗教间确实改变了。即使编译器生成的代码也没有显示对Box类的任何更改。

类可以用它们自己的实现替换默认实现。没有什么可以阻止Box将来添加int Weight {get;set;}

默认实现仅通过以下接口可用:

IDimensions box=new Box();
Console.WriteLine(box.Density);

特征

默认实现处理的另一个场景是traits。

假设我想将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链接位于此处

否。


提案说:

接口可能不包含实例状态。虽然现在允许使用静态字段,但接口中不允许使用实例字段。接口中不支持实例自动属性,因为它们会隐式声明隐藏字段。

(来源(

另请参阅第九频道对Mads Torgersen的C#8预览的采访,他们在采访中谈到了默认接口实现等问题。


默认接口方法不包含在Visual Studio 2019 Preview 1发布的C#8.0(测试版(中。在撰写本文时,默认接口方法原型仍在开发中。请参阅Champion的"默认接口方法">

相关内容

  • 没有找到相关文章

最新更新