接口c#中的属性

时间:2017-03-11 17:23:55

标签: c#

如果接口不应该在C#中具有属性,那么如何在接口中拥有属性,因为属性是属性的getter和setter?在这个类我们有这个例子,我认为接口应该只有方法声明。

interface IKnownProgrammingLanguages
{
    string[] ProgrammingLanguages { get; set; }
}

3 个答案:

答案 0 :(得分:5)

属性只是一个很好看的函数声明。在糖的下面,它们看起来像这样:

interface IKnownProgrammingLanguages
{
    void SetProgrammingLanguages(string[] value);
    string[] GetProgrammingLanguages();
}

接口不应该具有属性,因为实现类不能改变属性的行为 - 它们总是以相同的方式工作。但是每个实现类都可以定义SetProgrammingLanguagesGetProgrammingLanguages的运行方式,这就是为什么允许它们,并且通常很有用。

答案 1 :(得分:0)

接口声明了预期的内容。属性可以包含在接口中。这取决于接口的实现。

以下界面

interface IKnownProgrammingLanguages
{
    string[] ProgrammingLanguages { get; set; }
}

可以由像这样的类实现

class KnownProgrammingLanguages : IKnownProgrammingLanguages
{
    public string[] ProgrammingLanguages { get; set; }
}

如果接口仅在以下内容中定义了Getter属性:

interface IKnownProgrammingLanguagesGetterOnly
{
    string[] ProgrammingLanguages { get; }
}

实现必须具有Getter,但如果需要还可以实现Setter。只要它符合界面。

class KnownProgrammingLanguages : IKnownProgrammingLanguagesGetterOnly
{
    public string[] ProgrammingLanguages { get; set; }
}

需要注意的是,该实现也可以实现多个接口,并且在它之上有自己的方法和属性。

interface IFoo
{
    string Foo { get; }
}

interface IBar
{
    void Bar();
}

class BarAndFoo: IFoo, IBar
{
   public int OtherProperty { get; set; } // not defined in any interface

    public string Foo { get; set; } // complies with IFoo

    public void Bar() // complies with IBar
    {

    }
}

答案 2 :(得分:0)

定义的接口应该只有签名,声明应该在接口继承的类中,这对于方法和属性是相同的

例如:

>>> document = {"type": "build", "data": {"environment": "legacy"}}
>>> validator(document, abstract_task)
{'data': [{'oneof': ['none or more than one rule validate',
                     {'oneof definition 0': ["depends on these values: {'type': 'test'}",
                                             {'environment': ['unknown field'],
                                              'folder': ['required field']}],
                      'oneof definition 1': [{'environment': ['unallowed value legacy']}]}
                     ]}]}