2015-12-16 17 views
6

Ho due classi.due classi con metodi e proprietà comuni

Classe A:

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

e Classe B:

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

non condividono la stessa interfaccia o classe astratta. A e B hanno due distinti gerarchi e al momento non posso cambiarlo.

Voglio scrivere una singola procedura che funzioni per A e B e utilizzare i metodi QQ e WW.

Posso farlo? Puoi suggerire qualsiasi documento che posso studiare?

Serbatoi

+4

è possibile utilizzare un delegato –

+0

è molto simile al tipo dinamico – Admdebian

+0

"Non condividono la stessa interfaccia" - sì, al momento non esiste alcuna interfaccia che entrambi implementano. Tuttavia, hanno chiaramente una parte della loro superficie pubblica in comune. Quindi definisci un'interfaccia 'ICanQQAndWW', e falli implementare entrambi. Perché cercare un brutto trucco quando c'è già un modo ovvio e pulito per farlo? – AakashM

risposta

8

Questo è chiamato Duck Typing.

È possibile utilizzare le dinamiche

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

È inoltre possibile utilizzare la riflessione. (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

Ignora il fatto che l'oggetto dy potrebbe non avere un metodo QQ, che causerebbe un errore di runtime. – Domysee

+0

@Domysee Penso che sia meglio che nascondere quel fatto nel tuo approccio –

+0

@IvanStoev cosa intendi? C'è sempre la possibilità di lanciare un'eccezione se non si applica alcun tipo. – Domysee

4

È possibile verificare se l'oggetto è di tipo specifico, lanci e invocare il suo metodo:

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

In C# 6 è possibile semplificare questo per

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

Questo non è un metodo unico. Questa è una combinazione di due metodi. È possibile combinare tutti i metodi in tutto il mondo in un unico metodo utilizzando questo approccio. – dotctor

+3

in C# 6 può essere semplificato in '(o come A) ?. QQ();' –

+0

@ M.kazemAkhgary Grazie, ho aggiornato la risposta. – Domysee

-1

Cant basta fare una classe genitore e mettere questi metodi in esso e poi lasciare che A e B eredita da quella classe?

+1

* "A e B hanno due distinti gerarchi e non posso cambiarlo al momento." * – Domysee

+0

puoi spiegare la tua domanda in modo un po 'più dettagliato? come vuoi che entrambi questi metodi vengano chiamati contemporaneamente da un certo metodo in Main o da qualche parte? –

+0

Ho 2 classi con metodi uguali. Il primo è una classe di produzione e la seconda è una classe dell'ambiente di test. È assurdo, lo so. Devo scrivere un codice che funzioni sia in produzione che in ambiente di test e devo usare quelle classi. – Admdebian

Problemi correlati