例如,假设我想要一个ICar接口,并且所有实现都将包含字段Year。这是否意味着每个实现都必须单独声明Year?在接口中简单地定义它不是更好吗?


当前回答

已经说了很多,但为了简单起见,这里是我的看法。 接口的目的是拥有由使用者或类实现的方法契约,而不是使用字段来存储值。

你可能会问为什么允许有财产?因此,简单的答案是—属性在内部只定义为方法。

其他回答

为此,您可以有一个实现year字段的Car基类,所有其他实现都可以从它继承。

接口定义了公共实例属性和方法。字段通常是私有的,或者至多是受保护的、内部的或受保护的内部的(术语“字段”通常不用于任何公共的内容)。

正如其他回复所述,您可以定义一个基类并定义一个受保护的属性,该属性将被所有继承者访问。

一个奇怪的地方是,一个接口实际上可以被定义为内部的,但它限制了接口的有用性,并且它通常用于定义其他外部代码不使用的内部功能。

其他人已经给出了“为什么”,所以我只是补充说,你的界面可以定义一个控件;如果你把它包装在属性中:

public interface IView {
    Control Year { get; }
}


public Form : IView {
    public Control Year { get { return uxYear; } } //numeric text box or whatever
}

c#中的接口旨在定义类将遵循的契约——而不是特定的实现。

基于这种精神,c#接口确实允许定义属性——调用者必须为其提供一个实现:

interface ICar
{
    int Year { get; set; }
}

实现类可以使用auto-properties来简化实现,如果没有与属性相关的特殊逻辑的话:

class Automobile : ICar
{
    public int Year { get; set; } // automatically implemented
}

接口不包含任何实现。

定义带有属性的接口。 此外,您可以在任何类中实现该接口,并继续使用该类。 如果需要,可以在类中将此属性定义为virtual,以便修改其行为。