03/10/26 · 3 min de lectura

Member Hiding en C#

Cómo implementar la ocultación de miembros base en clases derivadas.

Imagen por Alex de Koning .

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();
        }
    }
}
Gist del proyecto

Apoya el contenido de mi blog a través de:

Fuente:

Copiado!