C # conversión entre las subclases de la clase padre problema

Para facilitar la presentación, donde un total de dos clases simples
clase padre: animales Clase (Animal)

/// <summary>
/// 动物类-父类
/// </summary>
public class Animal
{
    /// <summary>
    /// 脚
    /// </summary>
    public string Foot { get; set; }

    /// <summary>
    /// 头
    /// </summary>
    public string Head { get; set; }
}

Subclase: perros (perros)

/// <summary>
/// 狗类-继承动物类
/// </summary>
public class Dog : Animal
{
    /// <summary>
    /// 尾巴
    /// </summary>
    public string Tail { get; set; }

    /// <summary>
    /// 构造函数
    /// </summary>
    public Dog()
    {
        Head = "狗头";
        Foot = "狗腿";
        Tail = "狗尾巴";
    }
}

|

El primer paso: Si convertimos la clase clase Animal Perro

Dog dog = new Dog();

//转换为动物类---子类转换为父类
Animal animal = dog as Animal;

Siempre seguimos esta idea debería extenderse atributos se descarta subclase (en este caso la cola), dejando sólo los atributos de la clase dominante (de pie, cabeza). A continuación, el resultado de la clase Animal conversión debe este
Aquí Insertar imagen Descripción
segundo paso: Si continuamos volver a convertir el perro de clase de objeto Dog dog2 = animal as Dog;de clase de perro debería ser así
Aquí Insertar imagen Descripción
, pero de hecho, en el primer paso para Dogconvertir Animalel tiempo, Animalno puso Taileste lanzamiento de campo ir, como se muestra a continuación
Aquí Insertar imagen Descripción
, sin embargo, IntelliSense en VS y no pueden acceder al Tailestablecimiento utilizando el compilador también en cuenta
Aquí Insertar imagen Descripción
ya partir de los resultados anteriores, podemos adivinar los resultados reales de la segunda etapa, Dogla clase Tailno es el NULL
Aquí Insertar imagen Descripción
tercer paso : clase intento de los padres a una subclase
Aquí Insertar imagen Descripción
, obviamente, el padre y no pueden ser convertidos en sub-categorías, aunque la lata compilador, sino que tirar de tiempo de ejecución System.InvalidCastExceptionexcepciones, por supuesto, utilizar esta aspalabra clave para evitar esta anomalía, el resultado se devuelve NULL
entonces la clase padre cómo convertirlo en sub-clases? Por alguna clase relativamente simple, podemos asignar de forma individual por la que atraviesa el camino

Animal animal = new Animal
{
    Foot = "脚",
    Head = "头"
};

Dog dog = new Dog
{
    Foot = animal.Foot,
    Head = animal.Head,
};

Si hay varias propiedades cuando se utiliza este método está en problemas, entonces usted puede utilizar el 反射conjunto de atributos de recorrido a un valor correspondiente a

Animal animal = new Animal
{
    Foot = "脚",
    Head = "头"
};

Dog dog = new Dog();

//遍历Animal类的公共属性
foreach (PropertyInfo item in typeof(Animal).GetProperties())
{
    item.SetValue(dog, item.GetValue(animal));
}

resultados:
Aquí Insertar imagen Descripción

Más acerca de la reflexión puede hacer referencia a la documentación oficial

A esta conclusión debe ser clara

  • Las subclases pueden convertir clase padre y la subclase del atributo extendido es la retención de la clase padre 'recesivo', pero no se puede acceder a la parte posterior de la clase padre a una subclase.
  • El padre no se puede convertir en una subclase, donde toca entiende bien, después de todo, menos puede ser variada, menos variable y más para morir. Por supuesto, si la clase padre en subclases quiere atributos adicionales son los predeterminados NULLno es razonable, ya que el tipo de valor (por ejemplo: int) no se puede ajustarNULL
Publicado 62 artículos originales · ganado elogios 68 · vistas 160 000 +

Supongo que te gusta

Origin blog.csdn.net/ZUFE_ZXh/article/details/100521260
Recomendado
Clasificación