2010-06-26 3 views
6

Je vais avoir un problème conceptuel ici, j'ai comme ceci:méthode abstraite héritée La surcharge

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 

Je suis en train de changer la signature de la méthode « setSomething » dans la sous-classe « B » mais me donne une erreur que la sous-classe B n'implémente pas la classe abstraite de base, y at-il de toute façon à faire cela? Je veux surcharger une méthode abstraite héritée?

+2

N'est-ce pas dû à la faute de frappe? 'setSomethng' vs.' setSomething' –

+2

De plus, il n'y a pas de sous-classe D dans votre exemple. –

+0

Désolé j'ai édité que c'est B pas D. – Lisa

Répondre

13

Lorsque vous héritez d'une classe abstraite soit vous devez fournir des implémentations pour toutes les méthodes abstraites, ou bien vous doit déclarer la sous-classe aussi comme abstraite. Vous êtes autorisé à ajouter de nouvelles méthodes, mais vous ne pouvez pas supprimer ou modifier les méthodes existantes.

Avec cela à l'esprit que vous pouvez fournir deux surcharges de la méthode, une avec et une sans booléen supplémentaire:

class B : A 
{ 
    void setSomething(bool f1, bool f2){ /* implementation */ } 
    void setSomething(bool f1, bool f2, bool f3){ /* implementation */ } 
} 

Vous pouvez même envisager d'appliquer un en termes de l'autre:

void setSomething(bool f1, bool f2) { setSomething(f1, f2, false); } 
void setSomething(bool f1, bool f2, bool f3) { /* implementation */ } 

Si vous ne voulez pas que la version à deux paramètres soit là, vous devriez probablement reconsidérer s'il est approprié d'utiliser la classe A comme classe de base.

7

Une méthode est identifiée par son nom et sa signature. Par conséquent, afin de satisfaire l'implémentation de méthode abstraite, vous devez implémenter cette méthode avec cette signature (setSomething(bool f1, bool f2)). Il n'est pas important d'ajouter une surcharge, car la surcharge sera une nouvelle méthode et ne remplacera pas l'autre méthode. Bien sûr, la méthode abstraite surchargée peut appeler la méthode de surcharge afin d'éviter de dupliquer la mise en œuvre, comme suit:

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

Vous pouvez surcharger la méthode abstraite héritée, mais doit encore implémenter la méthode abstraite.

Questions connexes