2010-06-26 86 views
6
我在这里有一个概念性的问题

,我有这样的:重载继承抽象方法

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 

我试图改变“setSomething”方法的签名子类中的“B”,但它给我一个错误,说明子类B没有实现基本的抽象类,有没有办法做到这一点?我的意思是重载一个继承的抽象方法?

+2

这是不是由于错字? 'setSomethng'与'setSomething' – 2010-06-26 22:47:19

+2

另外,在你的例子中没有子类D. – 2010-06-26 22:48:58

+0

对不起,我编辑过它是B而不是D. – Lisa 2010-06-26 23:04:26

回答

13

当你从一个抽象类,您可能需要为所有抽象方法提供实现,否则你继承必须声明子类也是抽象的。您可以添加新方法,但不能删除或更改现有方法。

考虑到这一点,你可以提供该方法的两个重载,一个有和一个没有额外的布尔:

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作为基类。

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

您可以重载继承的抽象方法,但是您仍然需要执行抽象方法