我在这里有一个概念问题,我喜欢这个:
abstract class A
{ abstract setSomething(bool f1, bool f2);}
class C : A {setSomethng(bool f1, bool f2){/*implementation*/}}
class B : A {setSomething(bool f1, bool f2, bool f3){/*implementation*/} !! ERROR
我正在尝试更改子类“B”中“setSomething”方法的签名,但是它给出了一个错误,即子类B没有实现基本抽象类,无论如何要做到这一点?我的意思是重载一个继承的抽象方法?
答案 0 :(得分:15)
当您从抽象类继承时,您需要为所有抽象方法提供实现,否则您必须将子类声明为抽象。您可以添加新方法,但不能删除或更改现有方法。
考虑到这一点,你可以提供方法的两个重载,一个有一个没有额外的布尔值:
class B : A
{
void setSomething(bool f1, bool f2){ /* implementation */ }
void setSomething(bool f1, bool f2, bool f3){ /* implementation */ }
}
你甚至可能想考虑用另一个来实现一个:
void setSomething(bool f1, bool f2) { setSomething(f1, f2, false); }
void setSomething(bool f1, bool f2, bool f3) { /* implementation */ }
如果您不希望两个参数版本存在,那么您应该重新考虑是否适合使用A类作为基类。
答案 1 :(得分:7)
通过名称和签名识别方法。因此,为了满足抽象方法实现,您需要使用此签名(setSomething(bool f1, bool f2)
)实现此方法。
是否添加重载并不重要,因为重载将是一个新方法而不会覆盖另一个方法。当然,重写的抽象方法可以调用重载方法,以避免重复实现,如下所示:
class B : A {
override setSomething(bool f1, bool f2) {
setSomething(f1, f2, false); // use the default value you want to use for f3
}
setSomething(bool f1, bool f2, bool f3) {
/*implementation*/
}
}
答案 2 :(得分:2)
您可以重载继承的抽象方法,但仍然必须实现抽象方法。