2015-12-16 15 views
6

私は2つのクラスを持っています。一般的なメソッドとプロパティを持つ2つのクラス

クラスA:彼らは同じインタフェースまたは抽象クラスを共有していない

class B() { 
    public void QQ() {} 
    public void WW() {} 
} 

class A() { 
    public void QQ() {} 
    public void WW() {} 
} 

とクラスB。 AとBには2つの異なる階層があり、現時点でそれを変更することはできません。

AとBで動作し、QQメソッドとWWメソッドを使用する単一のプロシージャを記述したいと思います。

できますか?私が勉強することができる資料をお勧めしますか?あなたは、オブジェクトが特定の型であるかどうかを確認し、それをキャストし、そのメソッドを呼び出すことができます

戦車

+4

代理人 –

+0

を使用することができます。ダイナミックタイプ – Admdebian

+0

と同じです。「彼らは同じインターフェースを共有しません」 - はい、現在、両方とも実装している「インターフェース」はありません。しかし、彼らは明らかに共通の表面の一部を共有している。したがって、インターフェース 'ICanQQAndWW'を定義し、両方を実装するようにしてください。なぜそれを行うための明らかなクリーンな方法がある場合、醜いハックを検索するのはなぜですか? – AakashM

答えて

8

これはDuck Typingと呼ばれます。

あなたはダイナミクス

void Foo(dynamic dy) 
{ 
    dy.QQ(); 
} 

あなたはまた、リフレクションを使用することができますを使用することができます。 (reference

public static void CallQQ(object o) 
{ 
    var qq = o.GetType().GetMethod("QQ"); 
    if (qq != null) 
     qq.Invoke(o, new object[] { }); 
    else 
     throw new InvalidOperationException("method not found"); 
} 
+1

これは、オブジェクトdyがQQメソッドを持っていない可能性があるという事実を無視し、ランタイムエラーを引き起こします。 – Domysee

+0

@Domysee私はこれがあなたのアプローチでその事実を隠すよりも良いと思う。 –

+0

@IvanStoev何を意味しているのですか?型が適用されない場合、常に例外がスローされる可能性があります。 – Domysee

4

void InvokeQQ(object o){ 
    if(o is A) 
     (o as A).QQ(); 
    if(o is B) 
     (o as B).QQ(); 
} 

C#6では、

void InvokeQQ(object o){ 
    (o as A)?.QQ(); 
    (o as B)?.QQ(); 
} 
にこれを簡素化することができます
+1

これは一つの方法ではありません。これは2つの方法の組み合わせです。このアプローチを使用すると、世界中のすべてのメソッドを1つのメソッドに結合できます。 C#6の – dotctor

+3

は '(o as A)?QQ();' –

+0

@ M.kazemAkhgaryに簡略化することができます。 – Domysee

-1

カントあなただけの親クラスを作成し、その中でこれらのメソッドを配置し、AとBは、そのクラスを継承してみましょうか?

+1

*「AとBには2つの異なる階層があり、現時点でそれを変更することはできません」* – Domysee

+0

あなたの質問はもう少し詳しく説明できますか?あなたは、これらのメソッドの両方を、メインまたはどこかの特定のメソッドから同時に呼び出すことを望みますか? –

+0

私は等しい方法で2つのクラスを持っています。最初はプロダクションクラス、後者はテスト環境クラスです。 私が知っていることは不合理です。 プロダクション環境とテスト環境の両方で動作するコードを記述する必要があり、それらのクラスを使用する必要があります。 – Admdebian

関連する問題