重载继承的抽象方法

时间:2010-06-26 22:40:57

标签: c#

我在这里有一个概念问题,我喜欢这个:

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没有实现基本抽象类,无论如何要做到这一点?我的意思是重载一个继承的抽象方法?

3 个答案:

答案 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)

您可以重载继承的抽象方法,但仍然必须实现抽象方法。