Проблема одиночной отправки в основном знакома людям, занимающимся кодированием на статически типизированных языках, таких как Java и C #. Основная идея:
В то время как полиморфизм времени выполнения позволяет нам отправлять правильный вызов метода в соответствии с типом (типом времени выполнения) receiver
, например:
IAnimal mything = new Cat();
mything.chop();
Вызов метода будет выполняться в соответствии с типом времени выполнения mything
, а именно Cat
.
Это единственная возможность отправки (которая присутствует в Java / C #).
Теперь, если вам нужно диспетчеризовать не только тип получателя во время выполнения, но и типы (несколько) аргументов, вы столкнетесь с небольшой проблемой:
public class MyAcceptor {
public void accept (IVisitor vst) {...}
public void accept (EnhancedConcreteVisitor vst) {...}
}
Второй метод никогда не вызывается, потому что в нашем «потребительском» коде мы просто склонны обрабатывать различные типы объектов (посетителей в моем примере) по их общему супертипу или интерфейсу.
Вот почему я спрашиваю - потому что динамическая типизация допускает многопоточный полиморфизм, а C # 4.0 имеет это динамическое ключевое слово;)