Wie kann die Vererbung für einige Methoden verhindert werden?

7

Wie kann ich die Vererbung einiger Methoden oder Eigenschaften in abgeleiteten Klassen verhindern ?!

%Vor%     
Dr TJ 22.09.2010, 18:09
quelle

3 Antworten

18

Das gewünschte Muster ist Zusammensetzung ("Has-a"), nicht Vererbung ("Is-a"). BaseClass sollte eine Auflistung enthalten und nicht von der Auflistung erben. BaseClass kann dann selektiv auswählen, welche Methoden oder Eigenschaften an seiner Schnittstelle verfügbar gemacht werden sollen. Die meisten davon sind Passthroughs, die die entsprechenden Methoden für die interne Sammlung aufrufen.

Private Dinge in den untergeordneten Klassen zu markieren funktioniert nicht, da jeder mit einer Basistyp-Variablen ( Collection x = new DerivedClass() ) immer noch auf die "versteckten" Mitglieder über den Basistyp zugreifen kann.

Wenn "Is-a" gegen "Has-a" nicht für Sie klickt, denken Sie an Eltern oder Freunde. Du kannst deine Eltern nicht auswählen und sie nicht aus deiner DNA entfernen, aber du kannst wählen, mit wem du dich verbindest.

    
dthorpe 22.09.2010, 18:15
quelle
8

Sie können in diesem Fall keine Vererbung für den Job verwenden. Ihre Klasse muss die Sammlung als privates Mitglied haben, dann können Sie so viel oder so wenig davon freilegen wie Sie möchten.

    
Binary Worrier 22.09.2010 18:15
quelle
1

Der Versuch, ein öffentliches Mitglied einer Klasse in einer abgeleiteten Klasse zu verstecken, ist generell eine schlechte Sache (*). Der Versuch, es zu verbergen, um sicherzustellen, dass es nicht aufgerufen wird, ist noch schlimmer und wird im Allgemeinen nicht funktionieren.

Es gibt keine standardisierten idiomatischen Mittel, die ich kenne, um zu verhindern, dass ein geschütztes Mitglied der Elternklasse auf einen sub-abgeleiteten Typ zugreift, aber ein neues öffentliches nutzloses Mitglied einer eindeutig nutzlosen Art zu deklarieren wäre ein Ansatz. Das Einfachste wäre eine leere Klasse. Wenn beispielsweise die Klasse Foo eine leere öffentliche Klasse mit dem Namen MemberwiseClone deklariert, können Derivate von Foo MemberwiseClone nicht aufrufen - wahrscheinlich eine gute Sache, wenn MemberwiseClone die Invarianten der Klasse Foo aufbrechen würde.

(*) Die einzige Situation, in der es angebracht ist, ist, wenn eine öffentliche Methode einer abgeleiteten Klasse einen spezialisierteren Typ zurückgibt als die entsprechende Methode in der Basisklasse (z. B. kann eine CarFactory.Produce () -Methode ein Auto zurückgeben, während Die FordExplorerFactory.Produce () - Methode kann einen FordExplorer zurückgeben (der aus dem Auto stammt.) Jemand, der Produce () auf eine CarFactory (aber zufällig eine FordExplorerFactory) aufruft, erhält ein Auto (das zufällig ein FordExplorer ist) ), aber jemand, der Produce () aufsetzt, was zur Kompilierzeit als FordExplorerFactory bekannt ist, erhält ein Ergebnis, das zur Kompilierzeit als FordExplorer bekannt ist.

    
supercat 17.02.2011 23:23
quelle

Tags und Links