Если у меня есть различные подклассы чего-либо, и алгоритм, который работает с экземплярами этих подклассов, и если поведение алгоритма немного меняется в зависимости от того, каким конкретным подклассом является экземпляр, то самый обычный объектно-ориентированный способ сделать это использование виртуальных методов.
Например, если подклассы являются узлами DOM, и если алгоритм должен вставить дочерний узел, этот алгоритм отличается в зависимости от того, является ли родительский узел элементом DOM (который может иметь дочерние элементы) или текстом DOM (который не может ): и поэтому метод insertChildren
может быть виртуальным (или абстрактным) в базовом классе DomNode
и реализован по-разному в каждом из подклассов DomElement
и DomText
.
Другая возможность - дать экземплярам общее свойство, значение которого можно прочитать: например, алгоритм может прочитать свойство nodeType
базового класса DomNode
; или для другого примера у вас могут быть различные типы (подклассы) сетевых пакетов, которые имеют общий заголовок пакета, и вы можете прочитать заголовок пакета, чтобы увидеть, какой это тип пакета.
Я не очень много использовал информацию типа времени выполнения, в том числе:
- Ключевые слова
is
и as
в C #
- 1020 * понижающее приведение *
- Метод Object.GetType в точечной сети
- Оператор
typeid
в C ++
Когда я добавляю новый алгоритм, который зависит от типа подкласса, я вместо этого склоняюсь к добавлению нового виртуального метода в иерархию классов.
Мой вопрос: когда уместно использовать информацию типа времени выполнения вместо виртуальных функций?