2017-08-24 2 views
0

Ich versuche, den Mangel an Mehrfachvererbung Unterstützung in C# zu überwinden und Methode Extensions (fast erbt) ein paar Klassen erben zu können,:C# - Verwenden von Methodenerweiterungen für die Mehrfachvererbung?

public interface IA 
{ 
    // nothing 
} 
public static class A 
{ 
    public static void FunctionA(this IA a) 
    { 
    // do something 
    } 
} 

public interface IB 
{ 
    // nothing 
} 
public static class B 
{ 
    public static void FunctionB(this IB b) 
    { 
    // do something 
    } 
} 

public class Derived : IA, IB 
{ 
    // members 
} 

// main code 
Derived myDerivedobj = new Derived(); 
myDerivedobj.FunctionA(); // Call Function A inherited from Class A 
myDerivedobj.FunctionB(); // Call Function B inherited from Class B 

Obwohl dieser Code funktioniert, und ich bin in der Lage, die Funktionen zu nutzen ausgesetzt von Klasse A und Klasse B in meiner abgeleiteten Klasse, ist dies der richtige Weg, um es zu erreichen?

Dank

+0

Ich weiß nicht, was Sie mit dem ‚richtigen‘ bedeuten, aber es ist definitiv ein häufig verwendetes Verfahren. Auch: https://stackoverflow.com/q/2456154/302248 – Sach

+0

Wenn Ihre Schnittstellen tatsächlich keine Mitglieder haben, dann können diese beiden Funktionen nur "Objekt" -Instanzen akzeptieren, und es gibt keine Notwendigkeit für Schnittstellen überhaupt. – Servy

Antwort

1

Eine andere Möglichkeit ist Schnittstelle zu verwenden Methoden aufzudecken (anstelle von Erweiterungen). Und verwenden Sie aggregation und DI Code Doppelarbeit zu vermeiden, damit meine ich so etwas wie:

public interface IA 
{ 
    void FunctionA(); 
} 
public interface IB 
{ 
    void FunctionB(); 
} 
public class A : IA 
{ 
    // actual code 
} 
public class B : IB 
{ 
    // actual code 
} 

public class Derived : IA, IB 
{ 
    private IA _a; 
    private IB _b; 

    public Derived(IA a, IB b) 
    { 
     _a = a; 
     _b = b; 
    } 
    public void FunctionA() 
    { 
     _a.FunctionA(); 
    } 
    public void FunctionB() 
    { 
     _b.FunctionB(); 
    } 
} 
+0

Warum nicht Dekorateure? – codeSetter

+0

Dies ist ein Schritt vom Beispiel zu den Dekoratoren – ASpirin

Verwandte Themen