2009-03-11 11 views
5

ich diese Klasse in meiner Basis habe:Wie eine Basisklassenmethode außer Kraft zu setzen und fügen Sie einen Parameter

protected abstract XmlDocument CreateRequestXML(); 

Ich versuche, dies in meiner abgeleiteten Klasse außer Kraft zu setzen:

protected override XmlDocument CreateRequestXML(int somevalue) 
{ 
    ...rest of code 
} 

Ich weiß, das ist eine einfache Frage, aber weil ich einen Parameter eingeführt habe, ist das das Problem? Die Sache ist, einige der abgeleiteten Klassen können oder müssen nicht params in seiner Implementierung haben.

Antwort

11

Wenn Sie eine Methode außer dem Wort override anstelle von virtual oder abstract überschreiben, muss sie genau die gleiche Signatur wie die ursprüngliche Methode haben.

Was Sie hier getan haben, ist eine neue, nicht verwandte Methode zu erstellen. Es ist nicht möglich, einen Parameter einzugeben und trotzdem zu überschreiben.

+0

Ok, also sagen wir mal, Sie wollen sicherstellen, dass jede Klasse die Basisklasse erbt, um diese Methode implementieren zu müssen. Aber Sie wissen, dass es in einigen Fällen einige eingehende Parameter für diese Methode gibt und andere nicht. Dann was? Brauchst du keine Params und holst sie über ein Privfeld? – user72603

+0

Sie möchten also, dass Unterklassen die geschützte Methode implementieren, und in einigen Unterklassen möchten Sie manchmal params benötigen, weil das as von ihnen abhängt und in anderen Fällen nicht. Wenn die Methode nicht dazu gedacht ist, öffentlich konsumiert zu werden, könntest du von privaten Mitgliedern der Klasse bekommen ... ist das typisch? – user72603

+1

Ich versuche nur (Best Practice) herauszufinden, wann ich am besten eine geschützte oder sogar private Methode parameterlos belasse und stattdessen nur das bekomme, was man von privaten Feldern benötigt – user72603

0

Ja, der Parameter ist das Problem, die Methodensignatur muss genau übereinstimmen (einschließlich Rückgabewert und Parameter).

2

Wenn einige der abgeleiteten Klassen Parameter benötigen und andere nicht, müssen zwei überladene Versionen der Methode vorhanden sein. Dann kann jede abgeleitete Klasse diejenige überschreiben, die sie benötigt.

class Foo {  
    protected abstract XmlDocument CreateRequestXML(int somevalue); 
    protected abstract XmlDocument CreateRequestXML(); 
}; 

class Bar : public Foo {  
    protected override XmlDocument CreateRequestXML(int somevalue) { ... }; 
    protected override XmlDocument CreateRequestXML() 
     { CreateRequestXML(defaultInt); } 
}; 

Dies führt natürlich ein Problem des Benutzers an, der den falschen anruft. Wenn es keinen akzeptablen Standardwert für den zusätzlichen Parameter gibt, müssen Sie möglicherweise eine Ausnahme in der abgeleiteten Klasse auslösen, wenn die falsche Version aufgerufen wird.

0

Ich bin sehr gespannt, was Sie mit diesem Code erreichen wollen.

Normalerweise definieren Sie eine abstrakte Funktion, wenn eine Verwendungsklasse ihre Signatur kennt. Die Verwendungsklasse hat einen "Vertrag" mit Ihrer Basisklasse.

Wenn Sie von der Basisklasse ableiten und zusätzliche Parameter hinzufügen möchten, wie weiß die Verwendungsklasse, was auf der Basisklasse aufgerufen werden soll?

Es sieht wie ein architektonischer Fehler aus .... aber vielleicht können Sie dem Anfangsthema einige zusätzliche Informationen hinzufügen.

Verwandte Themen