这三个汽车属性有什么区别吗?
interface MyInterface {
public int p1 { get; set; }
public int p2 { get; }
public int p3 { set; }
}
为什么我们可以在界面中编写此代码而不在类中编写?
public int p { get; }
答案 0 :(得分:3)
出于同样的原因,你可以在界面中写这个:
interface IFace {
void Test();
}
此外,您的界面无效,因为public
在界面中无效。关键是,不同的东西在接口和类中是合法的。
当你在课堂上public int P1 { get; set; }
时,会变成一个自动属性。但是,你不能public int P1 { get; }
,因为你想要的意思是什么?应该总是返回0吗?没有办法设置它。因此,如果您想要一个只读属性,您必须自己定义getter:
int _p1;
public int P1 {
get { return _p1; }
}
另外。实现或多或少相同的另一种方法是:
public int P1 { get; private set; }
答案 1 :(得分:1)
这些属性之间存在差异。首先,您应该从声明中删除public
修饰符。其次,通过在块中放置get
或set
,您可以定义派生类中的哪些属性应该如何。例如,public int p1 { get; set; }
需要在派生类中使用getter和setter,public int p2 { get; }
只需要getter,public int p3 { set; }
只需要实现setter。
您不能在接口内部使用访问修饰符,因为接口是其他开发人员的指导原则,迫使他们在开发实现类时朝着某个方向前进。
查看this帖子了解更多相关信息。
答案 2 :(得分:1)
请记住,界面不包含任何实施数据。在接口中添加属性时,它只是说实现此接口的类需要具有get,set或两种方法的所述属性,具体取决于您编写的内容。因此,实现接口的任何类都必须使用get和set方法实现(或具有自动生成的)p1属性,使用get方法实现p2,使用set方法实现p3。接口并不关心这些是自动生成的还是您自己的自定义实现,它们只需要在实现类中。
因此,你可以写
int p { get; }
在一个接口中,因为它所做的就是告诉任何实现此接口的类必须具有带getter的属性p,同样,不关心它的实际实现 - 你可以编写一个getter来做一些计算,返回一些常量等等写在同一个类中的OTOH意味着你想要一个具有自动生成的后备字段的属性,除非它没有setter,你实际上不能改变它的值,所以它总是有它的默认值0
如上所述,您无法在界面中编写访问修饰符,因为所有界面成员都是隐式公开的。