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
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í
, pero de hecho, en el primer paso para Dog
convertir Animal
el tiempo, Animal
no puso Tail
este lanzamiento de campo ir, como se muestra a continuación
, sin embargo, IntelliSense en VS y no pueden acceder al Tail
establecimiento utilizando el compilador también en cuenta
ya partir de los resultados anteriores, podemos adivinar los resultados reales de la segunda etapa, Dog
la clase Tail
no es el NULL
tercer paso : clase intento de los padres a una subclase
, 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.InvalidCastException
excepciones, por supuesto, utilizar esta as
palabra 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:
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
NULL
no es razonable, ya que el tipo de valor (por ejemplo: int) no se puede ajustarNULL