Member Hiding en C#
Cómo implementar la ocultación de miembros base en clases derivadas.
Con la herencia, los miembros de una clase base están disponibles automáticamente, o heredados, en una clase derivada. Recrear, también conocido como redeclarar, los miembros de una clase base, en la clase derivada, se conoce como Member Hiding (ocultar un miembro).
Ocultar un miembro requiere un uso un poco distinto de la palabra clave
new. Para ocultar un miembro de una clase
basebase, el miembro de la clase derivada debe ser declarado con
new delante del tipo del miembro. Bajo circunstancias normales esto no afecta el uso de miembros declarados de esta manera.
public class ChildClass : ParentClass
{
new float someValue = 5f;
new void SayHello()
{
// Do something fun!
}
}No obstante, cuando una clase derivada se amplía a una clase base y el miembro se usa, será el miembro de la clase base a pesar de que el ejemplo sea de una clase derivada. Toma en consideración una jerarquía hereditaria donde los
Orcs (orcos) heredan de
Enemy (enemigo). El mismo que hereda de
Humanoid (humanoide).
humanoide => Enemy => Orc
En
Humanoid tenemos el método
Yell() (gritar), el mismo que reproduce un clip de sonido y mueve los brazos del modelo.
public class Humanoid
{
public void Yell()
{
// play audio clip
// move arms
}
}En
Enemy tenemos otra función llamada
Yell(), la misma que, esta vez, cambia el color de la textura principal del
Enemy a amarilo. Y ha sido declarada usando new.
public class Enemy : Humanoid
{
new void Yell()
{
// change material color to yellow
}
}
Orc también tiene una función nueva
Yell(), pero esta vez, envía el destino del
NavMesh a una isla nórdica de Shetland.
public class Orc : Enemy
{
new void Yell()
{
// Set nav mesh to Northern ShetLand Isle.
}
}Supongamos que tenemos una colección de objetos
Humanoids, la misma que incluye algunos
Humanoids, algunos
Enemies y algunos
Orcs. Si invocamos la función
Yell() en todos los objetos de la colección, cada uno de ellos invocará la versión
Humanoid de
Yell(). Esto es porque declaramos los objetos
Orc y
Enemy como
Humanoid. Y, han sido ampliados implícitamente a
Humanoid. Generalmente no se desea este comportamiento y por lo tanto, no se usa ordinariamente, pero es importante tenerlo en cuenta. De hecho, este comportamiento es exactamente lo opuesto a overriding.
public class SomeClass : MonoBehaviour
{
public Humanoid[] Humanoids
void Start()
{
// llamamos al método miembro Yell del tipo Humanoid
// en toda la coleción que es Humanoid
foreach (Humanoid variable in Humanoids)
{
variable.Yell();
}
}
}Apoya el contenido de mi blog a través de:
Fuente: