在接口中不可能有实例变量或任何实现。但我们可以有财产。不是属性只是获取和设置方法?获取和设置方法不仅仅是获取和设置变量的方法吗?这不是作弊吗?据我所知,C ++和Java不允许这样做。似乎C#中的接口实现有一些不那么“纯粹”的东西。
答案 0 :(得分:7)
不是属性只是获取和设置方法?
是的,他们是。他们是方法。行为,而不是有关如何实现该行为的实现细节。这是属性和字段之间的区别 - 这就是接口允许属性的原因。
获取和设置方法不仅仅是获取和设置变量的方法吗?
不,他们是方法。它们可以随心所欲地实现。他们可以通过简单的字段实现 - 但它们可能不是。 (您认为DateTime.Now
读取哪个字段?)
据我所知,C ++和Java不允许这样做。
Java当然允许你在接口上放置getter和setter方法......
答案 1 :(得分:4)
您在界面中看到的不是具体属性,它只是属性签名的定义(属性名称,返回类型访问修饰符,以及它是否具有获取权限)例如,在任何实现此接口的类中, 必须看起来像 。
在界面中,它是 NOT 一个get和set方法,它根本不是一个实际的方法,它只是get和set的定义方法必须在任何实现此接口的类中看起来像。
这可能听起来很微妙,但事实并非如此。这是一个巨大的区别。
我知道在抽象类中,我们引用诸如
之类的东西 public abstract void Required(int a, string b);
as 抽象方法。这是语义我猜,这里没有任何说法会改变普遍接受的用法,但它们(就像接口定义一样),实际上只是一个规范和对从这个派生的类中的方法签名的要求抽象类。
答案 2 :(得分:2)
属性只是两个方法,包作为单个名称。通过在接口(例如Name
)中定义属性,您实际上定义了两个单独的方法(get_Name
和set_Name
)。您可以根据需要定义方法(get
和set
访问器)。通常您返回或设置字段的值,但这不是强制性的。
您可以通过定义两个单独的方法(例如getName
和setName
)在Java或C ++中执行相同的操作。
接口中的属性可能看起来像C# auto-implemented properties,但它们确实不同。当您定义这样的界面时:
interface IPerson
{
string Name { get; set; }
}
您正在强制接口实现者创建名为Name
的读/写属性,但是当您在类中执行相同操作时:
class Person
{
public string Name { get; set; }
}
编译器自动创建一个后备字段来保存字符串值,并定义两个从/向该字符串字段读/写的方法。
答案 3 :(得分:2)
属性只是getter和setter,是的(您可以使用monodis
或ildasm
确认您的可执行文件,并看到它们只是方法。
因此接口中的属性只是抽象函数。是否有支持字段无关紧要。支持字段(属于该属性的变量)本质上与属性本身无关。
所以不,属性不需要内存,也不是数据,它们的后备字段可能是,但属性本身不是数据。