varias una qué polimorfismo metodos llamar instanciar hijo herencia heredar ejemplos derivadas derivada clases clase c# inheritance casting

una - polimorfismo en c#



Convierta clase base en clase derivada (6)

Eso no es posible. pero puedes usar un Object Mapper como AutoMapper

Ejemplo:

class A { public int IntProp { get; set; } } class B { public int IntProp { get; set; } public string StrProp { get; set; } }

En el arranque global.asax o aplicación:

AutoMapper.Mapper.CreateMap<A, B>();

Uso:

var b = AutoMapper.Mapper.Map<B>(a);

Es fácilmente configurable a través de una API fluida.

¿Es posible en C # convertir explícitamente un objeto de clase base a una de sus clases derivadas? Actualmente estoy pensando en crear un constructor para mis clases derivadas que acepten un objeto de clase base como parámetro y copien los valores de las propiedades. Realmente no me gusta esta idea, así que me gustaría evitarla si es posible.

Esto no parece que debería funcionar (el objeto se instancia como una nueva base, por lo que la memoria no se debe asignar para miembros adicionales de la clase derivada) pero C # parece permitirme hacerlo:

class BaseClass { ... some stuff ... } class DerivedClass : BaseClass { public bool MyDerivedProperty{ get; set; } } static void Main(string[] args) { BaseClass myBaseObject = new BaseClass(); DerivedClass myDerivedObject = myBaseObject as DerivedClass; myDerivedObject.MyDerivedProperty = true; }


He encontrado una solución para esto, sin decir que sea la mejor, pero se siente limpia para mí y no requiere ningún cambio importante en mi código. Mi código se parecía al tuyo hasta que me di cuenta de que no funcionaba.

Mi clase base

public class MyBaseClass { public string BaseProperty1 { get; set; } public string BaseProperty2 { get; set; } public string BaseProperty3 { get; set; } public string BaseProperty4 { get; set; } public string BaseProperty5 { get; set; } }

Mi clase derivada

public class MyDerivedClass : MyBaseClass { public string DerivedProperty1 { get; set; } public string DerivedProperty2 { get; set; } public string DerivedProperty3 { get; set; } }

Método anterior para obtener una clase base poblada

public MyBaseClass GetPopulatedBaseClass() { var myBaseClass = new MyBaseClass(); myBaseClass.BaseProperty1 = "Something" myBaseClass.BaseProperty2 = "Something else" myBaseClass.BaseProperty3 = "Something more" //etc... return myBaseClass; }

Antes de intentar esto, lo que me proporcionó un error al intentar transmitir

public MyDerivedClass GetPopulatedDerivedClass() { var newDerivedClass = (MyDerivedClass)GetPopulatedBaseClass(); newDerivedClass.UniqueProperty1 = "Some One"; newDerivedClass.UniqueProperty2 = "Some Thing"; newDerivedClass.UniqueProperty3 = "Some Thing Else"; return newDerivedClass; }

Cambié mi código de la siguiente manera y parece funcionar y tiene más sentido ahora:

Antiguo

public MyBaseClass GetPopulatedBaseClass() { var myBaseClass = new MyBaseClass(); myBaseClass.BaseProperty1 = "Something" myBaseClass.BaseProperty2 = "Something else" myBaseClass.BaseProperty3 = "Something more" //etc... return myBaseClass; }

Nuevo

public void FillBaseClass(MyBaseClass myBaseClass) { myBaseClass.BaseProperty1 = "Something" myBaseClass.BaseProperty2 = "Something else" myBaseClass.BaseProperty3 = "Something more" //etc... }

Antiguo

public MyDerivedClass GetPopulatedDerivedClass() { var newDerivedClass = (MyDerivedClass)GetPopulatedBaseClass(); newDerivedClass.UniqueProperty1 = "Some One"; newDerivedClass.UniqueProperty2 = "Some Thing"; newDerivedClass.UniqueProperty3 = "Some Thing Else"; return newDerivedClass; }

Nuevo

public MyDerivedClass GetPopulatedDerivedClass() { var newDerivedClass = new MyDerivedClass(); FillBaseClass(newDerivedClass); newDerivedClass.UniqueProperty1 = "Some One"; newDerivedClass.UniqueProperty2 = "Some Thing"; newDerivedClass.UniqueProperty3 = "Some Thing Else"; return newDerivedClass; }


No, no es posible. La única manera que es posible es

static void Main(string[] args) { BaseClass myBaseObject = new DerivedClass(); DerivedClass myDerivedObject = myBaseObject as DerivedClass; myDerivedObject.MyDerivedProperty = true; }


No, no hay una conversión incorporada para esto. Tendrá que crear un constructor, como lo mencionó, o algún otro método de conversión.

Además, como BaseClass no es un DerivedClass, myDerivedObject será nulo, y la última línea anterior emitirá una excepción de ref nula.


No, no hay una forma incorporada de convertir una clase como dices. La forma más sencilla de hacer esto sería hacer lo que sugirió: crear un DerivedClass(BaseClass) . En general, vendrían otras opciones para automatizar la copia de propiedades desde la base hasta la instancia derivada, por ejemplo, utilizando la reflexión.

El código que ha publicado usando compilará, como estoy seguro que ha visto, pero arrojará una excepción de referencia nula cuando lo ejecute, porque myBaseObject as DerivedClass evaluará null , ya que no es una instancia de DerivedClass .


Puede implementar la conversión usted mismo, pero yo no lo recomendaría. Eche un vistazo al Patrón Decorador si desea hacer esto para extender la funcionalidad de un objeto existente.