Короче говоря, одна отправка - это когда метод полиморфен по типу одного параметра (включая неявный this
).Двойная диспетчеризация - это полиморфизм двух параметров.
Типичным примером первого является стандартный виртуальный метод, который полиморфен для типа содержащего объекта.И второй может быть реализован через шаблон Visitor.
[update] Я предполагаю, что в вашем примере floppyDisk
, processor
и computer
каждый наследуют от общегобазовый класс, который определяет accept
как виртуальный метод.Точно так же методы visit*
должны быть объявлены виртуальными в equipmentVisitor
, которые должны иметь несколько производных классов с различными реализациями visit*
. [/ update]
Исходя из вышесказанного, accept
является полиморфным как для this
, так и equipmentVisitor
.Каждый из дисковода, процессора и компьютера имеет собственную реализацию accept
, поэтому, когда посетитель вызывает accept
, вызов отправляется в зависимости от типа вызываемого.Затем вызываемый абонент вызывает метод посещения, относящийся к типу посетителя, и этот вызов отправляется на основе фактического типа посетителя.
Теоретически возможна также тройная, четверная и т. Д. Отправка, хотя я никогда не виделэто реализовано на практике (в языках, которые не поддерживают двойные и более высокие диспетчеры по своей природе, то есть - мне кажется, я помню, что Smalltalk поддерживает?).Двойная диспетчеризация с использованием Visitor в C ++ и подобных языках сама по себе уже ошеломляет, поэтому реализация тройной и более высокой диспетчеризации будет слишком сложной для использования в реальных приложениях.