Diferencias entre sombrear y reemplazar
Actualización: noviembre 2007
Cuando define una clase que hereda de una clase base, a veces desea volver a definir uno o más elementos de la clase base en la clase derivada. El sombreado y el reemplazo están ambos disponibles para esta finalidad.
Comparación
Es fácil confundir el sombreado y el reemplazo. Ambos se utilizan cuando una clase derivada hereda de una clase base y ambos vuelven a definir un elemento declarado con otro. No obstante, existen diferencias significativas entre ambos.
La siguiente tabla compara sombrear y reemplazar.
Punto de comparación |
Sombrear |
Reemplazar |
---|---|---|
Finalidad |
Protege frente a una modificación posterior de clase base que introduce un miembro ya definido en la clase derivada |
Logra el polimorfismo mediante la definición de una implementación distinta de un procedimiento o propiedad con la misma secuencia de llamada1 |
Elemento redefinido |
Cualquier tipo de elemento declarado |
Sólo un procedimiento (Function, Sub o Operator) o propiedad |
Elemento de redefinición |
Cualquier tipo de elemento declarado |
Sólo un procedimiento o propiedad con la secuencia de llamada idéntica1 |
Nivel de acceso de elemento de redefinición |
Cualquier nivel de acceso |
No se puede cambiar el nivel de acceso de elemento reemplazado |
Lectura y escritura de elemento de redefinición |
Cualquier combinación |
No puede cambiar la capacidad de lectura o de escritura de la propiedad reemplazada |
Control sobre redefinición |
El elemento de clase base no puede cumplir o prohibir el sombreado |
El elemento de clase base puede especificar MustOverride, NotOverridable u Overridable |
Utilización de palabras clave |
Con las clases derivadas se recomienda el uso de Shadows; en caso de que no se especifique Shadows ni Overrides, se utilizará Shadows como predeterminada2 |
En una clase base se requiere Overridable o MustOverride y en una clase derivada se requiere Overrides. |
Herencia de elementos de redefinición mediante clases derivadas procedentes de una clase derivada en particular |
El elemento de sombreado será heredado por clases derivadas posteriores, mientras que el elemento sombreado permanecerá oculto3 |
El elemento que reemplaza a otro será heredado por clases derivadas posteriores; mientras que el elemento reemplazado permanecerá en el mismo estado. |
1 La secuencia de llamada se compone de tipo de elemento (Function, Sub, Operator o Property), nombre, lista de parámetros y tipo de valor devuelto. No se puede reemplazar un procedimiento con una propiedad o viceversa. No puede reemplazar un tipo de procedimiento (Function, Sub u Operator) con otro tipo.
2 si no especifica Shadows u Overrides, el compilador emite un mensaje de advertencia para ayudarle a asegurarse del tipo de redefinición que desea utilizar. Si omite la advertencia, se utiliza el mecanismo de sombreado.
3 Si el elemento de sombreado no está accesible en una clase derivada posterior, dicho sombreado no se hereda. Por ejemplo, si se declara como Private el elemento de sombreado, cualquier clase que se derive de la clase derivada hereda el elemento original en lugar del elemento de sombreado.
Instrucciones
Normalmente, el reemplazo se utiliza en los casos siguientes:
Cuando está definiendo las clases derivadas polimórficas.
Cuando quiere tener la seguridad de que el compilador cumpla el tipo de elemento idéntico y la secuencia de llamada.
Normalmente, el sombreado se utiliza en los casos siguientes:
Cuando prevé que se podría modificar su clase base y define un elemento utilizando el mismo nombre que el suyo.
Cuando quiere tener la libertad de cambiar el tipo de elemento o la secuencia de llamada.
Vea también
Tareas
Cómo: Distinguir entre dos elementos con el mismo nombre
Cómo: Ocultar una variable con el mismo nombre que su variable
Cómo: Ocultar una variable heredada
Cómo: Obtener acceso a una variable que oculta una clase derivada
Conceptos
Resolver una referencia cuando muchas variables tienen el mismo nombre