2011-01-28 18 views
14
public class SuperCar: Car 
{ 
    public bool SuperWheels { get {return true; } } 
} 

public class Car 
{ 
    public bool HasSteeringWheel { get {return true;} } 
} 

¿Cómo puedo establecer la clase base para el Supercar derivado?Clase derivada y base, ¿puedo establecer la base explícitamente?

Por ejemplo, quiero simplemente conjunto Supercars clase base como esto:

public void SetCar(Car car) 
{ 
SuperCar scar = new SuperCar(); 
car.Base = car; 
} 

Básicamente, si tengo objetos de coches, yo no quiero repetir manualmente a través de todos los bienes del coche con el fin de configurar el proyecto de SuperCar, que creo que es la única forma en que puedes hacerlo, pero si puedes hacerlo de otra forma, sería muchísimo mejor.

+2

** No. ** Razón breve: No hay * objeto base separado *. '(objeto) this == (object) base' es siempre verdadero. Sin embargo, hay formas de realizar la clonación/copia por reflexión (y otros medios). Quizás describa qué es * really * wanted :) –

+0

Si bien la pregunta no pregunta sobre la reflexión (o un constructor de copias) tal como está, agregué las etiquetas para generar una lista más interesante de preguntas relacionadas. Disfrutar. (http://stackoverflow.com/questions/3072518/can-reflection-be-used-to-instantiate-an-objects-base-class-properties parece particularmente interesante, y tal vez duplicado) –

+0

Sospecho que usted está suponiendo que C# es un * lenguaje de herencia prototipo *. No lo es. ¿Tiene una formación en programación en JavaScript por casualidad? –

Respuesta

0

En general, hay muchos comentarios útiles. Creo que la respuesta corta fue dada por pst y creo que esto es correcto:

No. Razón: no hay un objeto base separado. (objeto) esta == (objeto) base siempre es verdadera. Sin embargo, hay formas de realizar la clonación/copia por reflexión (y otros medios).Quizás describir lo que realmente quería

Por lo tanto, su sugerencia de utilizar la herramienta AutoMapper también era increíblemente útil y era básicamente lo que estaba buscando.

3

Esto no es posible.

Debe configurar manualmente las propiedades.

+0

Digamos que tengo una clase de persona y, por supuesto, hay miles de elementos de datos que representan la clase de persona. La clase de persona define diez mil propiedades. Ahora, tengo una identificación de persona que se asocia a la clase de persona particular de la que quiero derivar y creo una clase "John" heredada de persona. Ahora sé la identificación de una persona en particular que quiero pasar y esa será la base de "John". – Watson

+0

Puede crear un contenedor en lugar de usar la herencia. – SLaks

3

Si estoy entendiendo bien su pregunta (y no estoy del todo seguro de que soy), entonces usted puede conseguir una especie de la conducta que desea haciendo algo como esto:

class Car { 
    public bool CarProperty { get; set; } 
    // regular constructor 
    public Car() { 

    } 
    // "copy" constructor 
    public Car(Car c) { 
     CarProperty = c.CarProperty; 
    } 
} 

class SuperCar : Car { 
    public bool SuperCarProperty { get; set; } 
    // regular constructor 
    public SuperCar() { 
    } 
    // "copy" constructor 
    public SuperCar(Car c) : base(c) { 
     SuperCar sc = c as SuperCar; 
     if(sc != null) { 
      SuperCarProperty = sc.SuperCarProperty; 
     } 
    } 

A continuación, puede hacer esto:

public void SetCar(Car car) { 
    SuperCar scar = new SuperCar(car); 
} 

tenga en cuenta que usted tiene que ser muy cuidadoso en su constructor "copia" no copiar propiedades de tal manera que dos objetos comparten los mismos miembros (referencias) cuando no deberían hacerlo.

Tengo que preguntar, sin embargo, cuál es tu objetivo con esto?

+0

Mi objetivo es simple. Básicamente, en la vida real Supercar probablemente tenga 100 de propiedades. Entonces digamos que ahora mantengo una base de datos de superdeportivos.Ahora, quiero heredar de los superdeportivos, pero quiero pasar la clase base de los supercoches que ya he creado para mayor conveniencia. No quiero configurar manualmente 100 propiedades cuando HE CREADO YA el tipo de base. – Watson

+0

Parece que necesitas dividir SuperCar en objetos más pequeños. Entonces los objetos que son iguales entre SuperCars se pueden compartir. – siride

+0

Me preocupa más mi comprensión de la herencia en C#. Me parece que si la clase A deriva de la clase B, debería poder configurar B en A. Entonces, si tiene una instancia de una clase A, debería poder decir A.B = new B(); – Watson

0

En primer lugar, cada objeto SuperCar es diferente del otro. La herencia le ayuda a definir el comportamiento común de los objetos relacionados. No significa que sean los mismos objetos. Cada objeto de un tipo tiene su propio proceso de construcción. Antes de crear un objeto secundario, el objeto de la clase base se crea según la jerarquía de herencia. Si desea utilizar una propiedad común para todos los objetos de SuperCar, necesitará mantener una instancia separada del objeto de Auto dentro de la instancia de SuperCar, asignar el objeto común de coche al objeto de cabina en SuperCar y anular las propiedades derivadas de la base. objeto y redirigirlo a accesorios. del objeto interno del coche.

public class SuperCar: Car 
{ 
    public bool SuperWheels { get {return true; } } 

    Car carInstance = null; 
    public void SetCar(Car car) 
    { 
     carInstance = car; 
    } 
} 

Pero sigo creyendo que hay algo de malo en este diseño de la forma en que desea hacerlo. Si puede hacernos saber la imagen más amplia de por qué desea hacer esto, podemos idear un mejor diseño para satisfacer sus necesidades.

0

Solo puede copiar el contenido de otra clase, pero no configurarlo directamente. Vea el siguiente ejemplo usando lo que se llama un constructor de copia.

class Car 
{ 
    string model; 
    public Car(string model) { this.model = model; } 
    protected Car(Car other) { this.model = other.model; } 
    string Model { get; set; } 
} 

class SuperCar 
{ 
    public SuperCar(Car car) : base(car) { } 
    public SuperCar(string model) : base(model) { } 
    bool IsTurbo { get; set; } 
} 

La clave es la palabra clave base() después de la declaración del constructor.

9

que usar algo como esto en la subclase y funciona muy bien para mí:

using System.Reflection; 
. 
. 
. 
/// <summary> copy base class instance's property values to this object. </summary> 
private void InitInhertedProperties (object baseClassInstance) 
{ 
    foreach (PropertyInfo propertyInfo in baseClassInstance.GetType().GetProperties()) 
    { 
     object value = propertyInfo.GetValue(baseClassInstance, null); 
     if (null != value) propertyInfo.SetValue(this, value, null); 
    } 
} 
+0

Sí. Esto fue perfecto. – Watson

0

Si desea tener más control que copiar las propiedades reflejadas tratan de aplicar Builder. T puede ser cualquier clase derivada de BaseClass.

public static T BuildNew<T>(BaseClass baseClass) where T : BaseClass, new() 
{ 
    return new T 
    { 
     Property1 = baseModel.Property1, 
     Property2 = baseModel.Property2, 
    }; 
} 
Cuestiones relacionadas