2015-12-16 20 views
6

Ich habe zwei Klassen.zwei Klassen mit gemeinsamen Methoden und Eigenschaften

Klasse A:

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

und Klasse B:

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

Sie teilen nicht die gleiche Schnittstelle oder eine abstrakte Klasse. A und B haben zwei unterschiedliche Hierarchien und ich kann das im Moment nicht ändern.

Ich möchte ein einzelnes Verfahren schreiben, das für A und B funktioniert und QQ und WW-Methoden verwendet.

Kann ich das tun? Können Sie mir irgendein Dokument vorschlagen, das ich studieren kann?

Tanks

+4

Sie können einen Delegaten verwenden –

+0

es ist sehr ähnlich zu dynamischen Typ – Admdebian

+0

"Sie teilen nicht die gleiche Schnittstelle" - ja, derzeit gibt es keine 'Schnittstelle', die sie beide implementieren. Sie haben jedoch eindeutig einen Teil ihrer öffentlichen Oberfläche gemeinsam. Definieren Sie also eine Schnittstelle 'ICanQQAndWW' und lassen Sie sie beide implementieren. Warum nach einem hässlichen Hack suchen, wenn es schon einen offensichtlichen sauberen Weg dafür gibt? – AakashM

Antwort

8

Dies wird Duck Typing genannt.

können Sie Dynamik verwenden

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

Sie auch Reflexion nutzen können. (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

Das ignoriert, dass das Objekt dy keine QQ-Methode hat, die einen Laufzeitfehler verursachen würde. – Domysee

+0

@Domysee Ich denke, das ist besser, als diese Tatsache in Ihrem Ansatz zu verbergen –

+0

@IvanStoev was meinst du? Es gibt immer die Möglichkeit, eine Ausnahme auszulösen, wenn kein Typ zutrifft. – Domysee

4

Sie können prüfen, ob das Objekt von der speziellen Art ist, werfen sie dann und seine Methode aufrufen:

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

In C# 6 Sie können diese

void InvokeQQ(object o){ 
    (o as A)?.QQ(); 
    (o as B)?.QQ(); 
} 
zu

vereinfachen
+1

Dies ist keine einzige Methode. Dies ist eine Kombination von zwei Methoden. Sie können alle Methoden in der Welt in einer Methode kombinieren, die diesen Ansatz verwendet. – dotctor

+3

in C# 6 kann es vereinfacht werden zu '(o wie A) ?. QQ();' –

+0

@ M. kazemAkhgary Danke, ich aktualisierte die Antwort. – Domysee

-1

Cant Sie nur eine Elternklasse machen und diese Methoden in sie und dann lassen A und B erben von dieser Klasse?

+1

* "A und B haben zwei unterschiedliche Hierarchien und das kann ich im Moment nicht ändern." * – Domysee

+0

Kannst du deine Frage etwas genauer erklären? Wie wollen Sie, dass beide Methoden gleichzeitig von einer bestimmten Methode in Main oder irgendwo aufgerufen werden? –

+0

Ich habe 2 Klassen mit gleichen Methoden. Die erste ist eine Produktionsklasse und die letztere ist eine Testumgebungsklasse. Es ist absurd ich weiß. Ich muss einen Code schreiben, der sowohl in der Produktion als auch in der Testumgebung funktioniert, und ich muss diese Klassen verwenden. – Admdebian

Verwandte Themen