erben von zwei Klassen in C # [duplizieren]

7

Ich habe zwei Klassen, Klasse A und Klasse B. Diese zwei Klassen können sich nicht gegenseitig erben. Ich erstelle eine neue Klasse namens Klasse C. Nun möchte ich die Methoden in Klasse A und Klasse B durch Erben implementieren. Mir ist bewusst, dass Mehrfachvererbung in C # nicht möglich ist, aber gibt es andere Möglichkeiten, dies zu tun?

Danke

    
Virus 21.06.2012, 09:02
quelle

7 Antworten

27

Mehrfachvererbung ist in C # nicht möglich, kann jedoch mithilfe von Schnittstellen simuliert werden, siehe Simuliertes Mehrfachvererbungsmuster für C # .

Der Grundgedanke ist, eine Schnittstelle für die Mitglieder der Klasse B zu definieren, auf die Sie zugreifen möchten (nennen Sie IB ), und dann C erben von A und intern IB implementieren Speichern einer Instanz von B , zum Beispiel:

%Vor%

Es gibt auch ein paar andere alternative Muster auf dieser Seite erklärt.

    
KF2 21.06.2012, 09:07
quelle
7

Eine gängige Alternative zur Vererbung ist die Delegierung (auch Komposition genannt): X "hat ein" Y statt X "ist ein" Y. Also, wenn A Funktionalität für den Umgang mit Foos hat, und B Funktionalität für den Umgang mit Bars hat, und Sie beide in C wollen, dann etwas in etwa:

%Vor%     
Rich 21.06.2012 09:08
quelle
6

Wenn Sie den Methodencode von A und B verwenden möchten, können Sie Ihre C -Klasse eine Instanz von jedem enthalten. Wenn Sie Code für die Schnittstellen für A und B codieren, müssen Ihre Kunden nicht wissen, dass Sie ihnen eine C anstatt einer A oder einer B geben.

%Vor%     
Rawling 21.06.2012 09:13
quelle
4

Meinst du, du willst, dass Klasse C die Basisklasse für A & amp; B in diesem Fall.

%Vor%     
HatSoft 21.06.2012 09:18
quelle
3

Sie können eine Basisklasse für A und B definieren, wo Sie gemeinsame Methoden / Eigenschaften / Felder von diesen halten können.

Nach der Implementierung C:Base .

Oder um mehrere Vererbungen zu simulieren, definieren Sie eine gemeinsame interface (s) und implementieren Sie sie in C

Hoffe, das hilft.

    
Tigran 21.06.2012 09:04
quelle
3

Verwenden Sie die Komposition :

%Vor%

Dann können Sie C.A.DoA() aufrufen. Sie können die Eigenschaften auch in eine Schnittstelle oder eine abstrakte Klasse wie public InterfaceA A oder public AbstractClassA A ändern.

    
CodeCaster 21.06.2012 09:09
quelle
3

Machen Sie zwei Schnittstellen IA und IB :

%Vor%

Als nächstes make A implementieren IA und B implementieren IB .

%Vor%

Implementieren Sie dann Ihre C-Klasse wie folgt:

%Vor%

Im Allgemeinen ist dies insgesamt ein schlechter Entwurf, da sowohl A als auch B eine Methode mit demselben Namen und Variablentypen wie foo(int bar) implementieren können und Sie entscheiden müssen, wie sie implementiert werden soll Sie rufen einfach foo(bar) sowohl für _a als auch für _b auf. Wie an anderer Stelle empfohlen, sollten Sie die Eigenschaften .A und .B berücksichtigen, anstatt die beiden Klassen zu kombinieren.

    
Seph 21.06.2012 09:14
quelle

Tags und Links