Si tengo varias subclases de algo, y un algoritmo que opera en instancias de esas subclases, y si el comportamiento del algoritmo varía ligeramente dependiendo de qué subclase particular es una instancia, entonces la forma más común orientada a objetos para hacer esto está usando métodos virtuales.Cuándo utilizar la información de tipo de tiempo de ejecución?
Por ejemplo, si las subclases son nodos DOM, y si el algoritmo debe insertar un nodo secundario, ese algoritmo difiere dependiendo de si el nodo padre es un elemento DOM (que puede tener hijos) o DOM (que puede ' t): así que el método insertChildren
puede ser virtual (o abstracto) en la clase base DomNode
, e implementado de manera diferente en cada una de las subclases DomElement
y DomText
.
Otra posibilidad es dar a las instancias una propiedad común, cuyo valor se puede leer: por ejemplo, el algoritmo podría leer la propiedad nodeType
de la clase base DomNode
; o para otro ejemplo, puede tener diferentes tipos (subclases) de paquete de red, que comparten un encabezado de paquete común, y puede leer el encabezado del paquete para ver qué tipo de paquete es.
No he utilizado la información de tipo de tiempo de ejecución mucho más, incluyendo:
- Los
is
yas
palabras clave en C# - downcasting
- El método Object.GetType en la red del punto
- El operador
typeid
en C++
Cuando agrego un nuevo algoritmo m, que depende del tipo de subclase, en cambio, tiendo a agregar un nuevo método virtual a la jerarquía de clases.
Mi pregunta es, ¿cuándo es apropiado usar información de tipo de tiempo de ejecución, en lugar de funciones virtuales?
¿Cuál es el motivo para decir que RTTI está en desuso, un método de último recurso? – ChrisW
@ChrisW, es más difícil de entender y mucho más lento de ejecutar. No está en desuso, es solo que otros métodos son mejores :) – vava
Hay pocas razones para que sea más lento: el RTTI se puede almacenar en la clase vtable, al igual que un puntero de función virtual. No estoy seguro de por qué es más difícil de entender, porque, de alguna manera, la comprobación de RTTI es más local: por ejemplo, si ves "if (foo es Foo)", entonces sabes lo que se está comprobando, sin ir y mirar las definiciones de las funciones virtuales en varias subclases. – ChrisW