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
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:
Es gibt auch ein paar andere alternative Muster auf dieser Seite erklärt.
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% 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.
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.
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.
Machen Sie zwei Schnittstellen IA
und IB
:
Als nächstes make A
implementieren IA
und B
implementieren IB
.
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.