перегрузка метода и полиморфизм

Смотрите на Joda-разовый ( https://www.joda.org/joda-time / ).

DateTimeFormatter parser = ISODateTimeFormat.date();

DateTime date = parser.parseDateTime(dateString);

String nextDay = parser.print(date.plusDays(1));

5
задан Thorarin 28 July 2009 в 19:41
поделиться

3 ответа

Тег "dispatch" в этом вопросе вполне уместен: то, что вы хотите, называется «множественная отправка». C # (как и большинство основных языков) поддерживает только «однократную отправку», когда выполняемый метод выбирается исключительно на основе (времени выполнения) типа объекта, для которого вы вызываете метод, а не типа (времени выполнения) его аргументов.

Паттерн посетитель часто можно использовать для решения этой проблемы. Идея состоит в том, что вы даете DocumentFieldBase метод (который вы переопределяете в конкретных подклассах), который вызывает метод в Control (также переопределяемый в конкретных подклассах), который выполняет фактическую работу.

К сожалению, исходный код класса Control , вероятно, не находится под вашим контролем * ... так что вам придется прибегнуть к еще более хакерскому решению. Принятый ответ на этот вопрос дает ответ, в котором используется отражение.

5
ответ дан 13 December 2019 в 19:32
поделиться

До C # 4 вся перегрузка выполнялась во время компиляции. Вы должны использовать двойную отправку или шаблон посетителя для эффективной перегрузки во время выполнения, и это быстро становится беспорядком.

В C # 4 вы можете объявить переменную как динамическую и позволить всем разобраться во время выполнения:

foreach (DocumentFieldBase field in fields){
  dynamic control = FindControl(field.Identifier);
  Bind(control, field)
}

Очевидно, что на данный момент это не очень помогает (если вы не используете VS2010b1).

Один из вариантов - использовать карту от типа до Action , но затем у вас возникают проблемы с наследованием ... (вам, возможно, придется продолжать работать с иерархией типов от конкретного типа до объекта, пока вы не найдете запись на карте). Вам также все равно нужно будет привести к нужному типу внутри действия: (

6
ответ дан 13 December 2019 в 19:32
поделиться

Не могли бы вы иметь абстрактный нестатический метод Bind () в DocumentFieldBase, а затем выполнять понижающее преобразование внутри реализации каждого конкретного класса? Каждый класс DocumentFieldBase знает, какой тип Control он получает, не так ли?

0
ответ дан 13 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: