如果接口不应该在C#中具有属性,那么如何在接口中拥有属性,因为属性是属性的getter和setter?在这个类我们有这个例子,我认为接口应该只有方法声明。
interface IKnownProgrammingLanguages
{
string[] ProgrammingLanguages { get; set; }
}
答案 0 :(得分:5)
属性只是一个很好看的函数声明。在糖的下面,它们看起来像这样:
interface IKnownProgrammingLanguages
{
void SetProgrammingLanguages(string[] value);
string[] GetProgrammingLanguages();
}
接口不应该具有属性,因为实现类不能改变属性的行为 - 它们总是以相同的方式工作。但是每个实现类都可以定义SetProgrammingLanguages
和GetProgrammingLanguages
的运行方式,这就是为什么允许它们,并且通常很有用。
答案 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']}]}
]}]}