Как построить двойную диспетчеризацию с использованием расширений
У меня есть библиотека, которая имеет иерархию классов следующим образом:
class Base {}
class A : Base {}
class B : Base {}
Теперь я хотел сделать разные вещи в зависимости от типа моего объекта, будь то A или B. Поэтому я решил пойти и реализовать двойную диспетчеризацию, чтобы избежать проверки типа.
class ClientOfLibrary {
public DoStuff(Base anObject)
{
anObject.MakeMeDoStuff(this);
}
private void DoStuffForanA(A anA);
private void DoStuffForaB(B aB);
}
Теперь каноническим способом реализации двойной диспетчеризации является создание метода MakeMeDoStuff
аннотация в Base
и перегрузить его в конкретный класс. Но помни это Base
, A
а также B
находятся в библиотеке, поэтому я не могу пойти и добавить делает метод свободно.
Добавление расширения метода не будет работать, потому что нет способа добавить абстрактные расширения.
Любое предложение?
1 ответ
Вы можете просто использовать dynamic
звонки:
class ClientOfLibrary {
public DoStuff(Base o)
{
DoStuffInternal((dynamic)o);
}
private void DoStuffInternal(A anA) { }
private void DoStuffInternal(B aB) { }
private void DoStuffInternal(Base o) { /* unsupported type */ }
}
C# изначально поддерживает множественную диспетчеризацию с момента появления dynamic
Таким образом, реализация шаблона посетителя в большинстве случаев не требуется.