接口继承:是否可以扩展属性?

Mal*_*lki 25 c# inheritance properties interface

我想做这个:

interface IBase
{
    string Property1 { get; }
}

interface IInherited : IBase
{
    string Property1 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

因此,这IInherited将具有允许添加功能的继承属性.Property1set

那可能吗?语法是什么?

编辑:请注意我把"继承"这个词放在粗体字中.我具体要求继承该属性,而不是将其隐藏在新属性背后.

Dan*_*Tao 24

如果这样做的唯一方法就是使用new关键字困扰你,那么在我看来,你认为接口是错误的.

当然,你可以说IInherited"继承自" IBase; 但这究竟意味着什么?这些是接口; 他们建立代码合同.通过隐藏IBase.Property1属性new string Property1 { get; set; },您不会隐藏任何功能.因此,许多开发人员认为隐藏为"坏"事物的传统原因 - 它违反了多态性 - 在这种情况下无关紧要.

问问自己:接口界面真正重要的是什么?它们提供了对某些方法调用的响应保证,对吧?

因此,给定以下两个接口:

interface IBase
{
    string Property1 { get; }
}

interface IInherited : IBase
{
    new string Property1 { set; }
}
Run Code Online (Sandbox Code Playgroud)
  1. 如果对象实现IBase,您可以读取其Property1属性.
  2. 如果一个对象实现IInherited,你可以读取它的Property1属性(就像IBase实现一样),你也可以写它.

再说一次,这里真的没什么问题.

  • 除了明确实现的情况外,你是对的.您可以为每个版本使用不同的实现,因此它仍然隐藏.实现您的界面的人有可能无意或有意地执行此操作,因此您应该小心如何使用这些界面.如果你想避免这个问题,仍然使用继承,那么使用"new",但不要添加第二个getter. (5认同)
  • 提问者是对的,这是一个问题。例如,对于您的解决方案,它将无法编译:`static void M(IInherited x){var read = x.Property1; }原因是IBase的Property1被__Property1的___another___属性隐藏,该属性在继承链的“更高”点声明。但是,如果只有`set`,则后者属性。我认为,`new`修饰符从根本上是错误的,因为它表示我们具有不相关的属性。它不会“扩展”现有属性。另一个带有`{get; 组; 就像@Timwi所说的那样,`new`属性中的}`也很糟糕。 (2认同)

Jam*_*unt 1

无论如何,你的代码应该可以工作......它只是因为隐藏 Property1 而创建了一个编译器警告。要使用新前缀清除 IInherited 中的此警告标记 Property1