2012-10-02 6 views
7

ist es möglich, diese Funktionalität zu implementieren? Ich habe zwei abstrakte Klassen, und ich will eine dritte Klasse zwingen, alle abstrakten Methoden in den beiden Klassen hier.net Mehrere Vererbung von abstrakten Klassen

public abstract class A 
{ 
    private void MethodA() 
    { 
     var fool = Prop*2; 
    } 
    public abstract int Prop { get; } 
} 
public abstract class B 
{ 
    private void MethodB() 
    { 
     //.... 
     SomeMethod(); 
     //.... 
    } 
    public abstract void SomeMethod(); 
} 

public class C: A, B 
{ 
    public int Prop { .... } 
    public void SomeMethod { .... } 
} 

Das Hauptproblem ist, zu implementieren, dass die implementierten endgültigen Klassenmethoden werden dann in Base abstrakte Klassen, und dies kann nicht mit Schnittstellen erreicht werden. Also gibt es keinen Workaround?

Ich habe viele ähnliche q/a gelesen, aber nichts reagiert auf mein Problem. Danke

+0

Wie Claudio sagte, Mehrfachvererbung ist nicht erlaubt. Hier ist eine gute Lektüre zu diesem Thema: http://blogs.msdn.com/b/dachou/archive/2008/04/17/net-and-multiple-inheritance.aspx – Gromer

Antwort

10

Nein, C# unterstützt keine Mehrfachvererbung. Sie könnten mehrere Schnittstellen implementieren, aber das ist natürlich nicht das Gleiche, da an Schnittstellen kein konkretes Verhalten implementiert werden kann.

+0

Das Hauptproblem hier ist, dass die implementierte letzte Klasse Methoden werden dann in abstrakten Basisklassen verwendet, und dies kann nicht mit Schnittstellen erreicht werden. Also gibt es keinen Workaround? –

+3

@Michele Virgilio: Ich fürchte, dass die kurze Antwort ist, dass es keine Umgehungslösung außer einem neuen Design Ihrer Klassen gibt. –

1

Das speziell? Nein, da Mehrfachvererbung in C# nicht unterstützt wird.

Die nächstgelegene Sie würden über eine Schnittstelle bekommen konnte, die zwei anderen zusammen:

public interface ISomeInterfaceA 
{ 
    int Prop { get; } 
} 

public interface ISomeInterfaceB 
{ 
    void SomeMethod(); 
} 

public interface ICombined : ISomeInterfaceA, ISomeInterfaceB 
{ 

} 

Dann könnten Sie Argumente von ICombined Art erfordern, aber das bekommen nicht vollständig, was Sie wollen.

public class A : ISomeInterfaceA, ISomeInterfaceB 
{ 
    ... 
} 

qualifizieren würde dies nicht, da ich nicht explizit die kombinierte Schnittstelle implementieren, um nur die zwei Schnittstellen, die es zusammengesetzt ist: Zum Beispiel, wenn ich dies tun würde.

0

Wenn Sie bereit sind, die Funktionalität in der letzten Klasse zu implementieren, können Sie Schnittstellen erstellen und so viele implementieren, wie Sie wollen ...

2

Sie dies über Mixins in C# tun können, ist es anders als Mehrfachvererbung implementiert aber am Ende bekommst du ein Objekt mit allen Methoden aus mehreren Klassen.

Es ist kein Merkmal der Sprache, aber es kann in Dritten gefunden werden.

Sie können darüber auf my answer to this other question oder direkt auf re-mix's codeplex

ein paar Punkte von Interesse gelesen:
- Sie Methoden in einem Mixin außer Kraft setzen können, damit von außen das Verhalten der neu geschaffenen Klassen ändern.
- Sie können Bereiche erstellen, in denen Klassen unterschiedlich sind, während sie innerhalb des Bereichs erstellt werden.
- Sie müssen gemischte Objekte über eine Factory erstellen (neues MyObject() wird Mixins nicht berücksichtigen, zum Glück).