初始状态:
interface ISomeInterface
{
int SomeProperty { get; }
}
abstract class SomeClass
{
public abstract int AnotherProperty { get; }
}
class InheritedClass : SomeClass, ISomeInterface
{
public int SomeProperty { get; set; }
public override int AnotherProperty { get; set; }//Ошибка
}
为什么在派生类中实现抽象属性时添加了抽象属性中未声明的getter或setter会出错?为什么在相同条件下在接口中声明的属性没有错误?
在接口方面,一切都是正确的。该属性是几个方法。在接口中,我们强制实现接口的类使用指定的访问器实现属性,同时不对第二个访问器的存在或不存在强加任何条件。
对于抽象类,它有点复杂。在实现抽象属性时,我们必须在属性前面加上关键字,以
override
告诉编译器该属性是在基类中声明的。因此,我们有一个矛盾:一方面,我们试图向继承类添加一个新方法,这应该不会引起任何问题,另一方面,根据语言的语法,我们试图覆盖一个不存在的方法,这很自然地导致编译错误。
为什么这样做的问题,我将留给语言规范开发者的良心,无论如何,它不太可能在不久的将来被修复,如果有的话,所以考虑这个更容易语言的“特征”,只要注意它。
如何解决这个问题
绕过此“功能”的可能解决方案之一:
另一种选择是将属性移到单独的接口中并在派生类中实现它,那么问题似乎可以自行解决,但有时这样的解决方案是不可接受的,例如,如果抽象类实现了使用的方法这个性质。
好吧,激进的选择是放弃这样的属性,并返回到经典方法
GetXXX()
和SetXXX(value)
,这个选项在绝对任何条件下都是可能的,并且不会在接口或抽象类中引起问题,但会降低代码的可读性,尽管这当然是一个业余爱好者,但例如在 Java 中,如果最近没有发生重大变化,这是唯一可能的选择。