2017-08-24 17 views
0

私はメソッドの拡張機能を使用していくつかのクラスをC#で多重継承のサポートの欠如を克服し、(ほとんど継承)を継承することができるようにしようとしています:このコードは動作しC# - 多重継承のメソッド拡張を使用しますか?

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 

けど、私は機能を利用することができています私の派生クラスでクラスAとクラスBによって公開されている、これを達成するための適切な方法ですか?

おかげ

+0

を私はあなたが「正しい」によって何を意味するのか分からないが、それは間違いなく、一般的に用いられている方法です。また:https://stackoverflow.com/q/2456154/302248 – Sach

+0

あなたのインターフェースが実際にメンバーを持たない場合、それらの2つの関数は単に 'object'インスタンスを受け入れることができ、インターフェースはまったく必要ありません。 – Servy

答えて

1

もう一つの方法は、(代わりに拡張子の)メソッドを公開するためのインタフェースを使用することです。そして、それによって、私のようなものを意味し、コードの重複を避けるためにaggregationDIを使用します。

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

なぜデコレータはありませんか? – codeSetter

+0

質問の例からデコレータまでのステップです – ASpirin