2015-12-16 4 views
6

У меня есть два класса.2 класс с общими методами и свойствами

Класс A:

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

А Класс B:

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

Они не разделяют один и тот же интерфейс или абстрактный класс. A и B имеют два отличных иерархичности, и я не могу изменить это на данный момент.

Я хочу написать один процесс, который работает для 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

Это не один метод. Это комбинация двух методов. Вы можете комбинировать все методы в мире с одним методом, используя этот подход. – dotctor

+3

в C# 6 его можно упростить до '(o as A) ?. QQ();' –

+0

@ M.kazemAkhgary Спасибо, я обновил ответ. – Domysee

-1

Cant вы просто сделать родительский класс и положить эти методы в ней, а затем пусть A и B наследует от этого класса?

+1

* «А и B имеют два отличных стиля, и я не могу изменить это на данный момент». * – Domysee

+0

вы можете объяснить свой вопрос чуть подробнее? как вы хотите, чтобы оба эти метода вызывались одновременно с определенным методом в Main или где-нибудь? –

+0

У меня есть 2 класса с равными методами. Первый - это производственный класс, а последний - класс тестовой среды. Это абсурд, я знаю. Мне нужно написать код, который работает как в производстве, так и в тестовой среде, и я должен использовать эти классы. – Admdebian

Смежные вопросы