Как построить двойную диспетчеризацию с использованием расширений

У меня есть библиотека, которая имеет иерархию классов следующим образом:

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Таким образом, реализация шаблона посетителя в большинстве случаев не требуется.

Другие вопросы по тегам