Разрешение метода при использовании динамического метода и обработка неопределенного метода для определенного производного класса - PullRequest
0 голосов
/ 18 ноября 2018

Давайте предположим следующий граф наследования:

A <-B <-C <-D <-E <-... (дерево наследования на самом деле более сложное, чем в этом примере, и содержит сотнифактических типов).<strong> Я не владею этими типами и не контролирую их реализацию

Давайте также предположим набор статических методов:

Handle (A a), Дескриптор (B b), дескриптор (C c), дескриптор (D d) и т. Д.

Моя текущая реализация дескриптора (A a) «отправляет» требуемый метод с помощью dynamic ключевое слово:

public static void Handle(A a)
{
    Handle((dynamic)a);
}

public static void Handle(B b)
{
    //B specific processing
}

//And so on

Хост-приложение отправляет мне объекты в A[], хотя каждый объект может иметь свой тип времени выполнения.В сущности, меня даже не интересуют объекты типа A.

. Мне нужны разные методы Handle, потому что обработка, которую хочет выполнить клиент, отличается в зависимости от типа времени выполнения объектов.

Моя реализация работает очень хорошо до тех пор, пока в моем коде есть метод Handle с соответствующей сигнатурой для типа времени выполнения объектов, в которые я передан, но, как это происходит сейчас, когдапередается объект, который не имеет определенного метода Handle, метод Handle(A a) вызывается рекурсивно, вызывая переполнение стека.

Я, очевидно, не могу определить метод Handle(X x) для каждого из стаили около того типов, которые я мог бы передать из хост-приложения, и каждая последующая версия API этого хост-приложения может определять новые типы.

Поэтому мой вопрос заключается в том, как обрабатывать типы, у которых нет определенного Handleметод без необходимости делать бесконечную серию операторов if или даже длинную инструкцию switch для фильтрации объектов, для которых я надеваюу вас нет метода-обработчика?

Есть ли способ во время выполнения определить, существует ли на самом деле метод Handle для типа времени выполнения переданного объекта?Или есть другие способы аккуратно обработать «недостающие» методы?

Любые идеи / рекомендации приветствуются.

1 Ответ

0 голосов
/ 23 ноября 2018

Я не помню, откуда у меня появилась идея отправки в Handle(A a).Я помню, что видел что-то подобное на каком-то веб-сайте, но теперь я понимаю, что это, должно быть, относится к другому варианту использования, чем то, чего я пытаюсь достичь.

Я решил свою проблему, просто переместив актерский состав (dynamic)obj вне методов «Обработка» и обратно на вызывающую сторону:

 Logger.Handle((dynamic)obj);

И в моих реализациях метод для основы иерархии теперь является просто пустым методом:

 public class Logger
 {
      public static void Handle(A a){}

      public static void Handle(B b)
      {
           //B specific handling
      }

      //All other Handle methods
 }

Это решает проблему.Если для производного типа не существует определенного метода, вызывается метод Handle(A a), ничего не делающий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...