Производный и базовый класс, могу ли я установить базу явно?

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

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

Как я могу установить базовый класс для производного Supercar?

Например, я хочу просто установить базовый класс SuperCars следующим образом:

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

В принципе, если у меня есть объекты Car, я не хочу вручную перебирать все свойства автомобиля, чтобы настроить SuperCar oject, который, я думаю, является единственным способом, которым вы можете это сделать, но если вы можете это сделать, иначе было бы намного лучше.

Ответы

Ответ 1

В целом много полезных комментариев. Я думаю, что короткий ответ был дан pst, и я думаю, что это правильно:

<я > Нет. Краткая причина: нет отдельного базового объекта. (объект) эта база == (object) всегда верна. Существуют способы выполнения клонирования/копирования путем отражения (и других средств). Возможно, опишите, что действительно нужно

Итак, его предложение об использовании инструмента automapper также было невероятно полезным и было в основном тем, что я искал.

Ответ 2

Я использую что-то вроде этого в подклассе, и он отлично работает для меня:

using System.Reflection;
.
.
.
/// <summary> copy base class instance 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);
    }
}

Ответ 3

Это невозможно.

Вам нужно вручную установить свойства.

Ответ 4

Если я правильно понимаю ваш вопрос (и я не совсем уверен, что я есть), то вы можете получить нужное поведение, сделав что-то вроде этого:

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;
        }
    }

Затем вы можете сделать это:

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

Обратите внимание, что вы должны быть очень осторожны в своем конструкторе "copy", чтобы не копировать свойства таким образом, что два объекта совместно используют одни и те же элементы (ссылки), когда они этого не делают.

Я должен спросить, какова ваша цель с этим?

Ответ 5

Прежде всего, каждый объект SuperCar отличается от другого. Наследование помогает определить общее поведение связанных объектов. Это не значит, что они одни и те же объекты. Каждый объект типа имеет свой собственный процесс построения. Перед созданием дочернего объекта объект базового класса создается в соответствии с иерархией наследования. Если вы хотите использовать общее свойство для всех объектов SuperCar, вам нужно будет сохранить отдельный экземпляр объекта Car в экземпляре SuperCar, назначить общий автомобильный объект в объект автомобиля в SuperCar и переопределить свойства, полученные из базового автомобиля объект и перенаправить его на реквизит. внутреннего автомобильного объекта.

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

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

Но я полагаю, что что-то не так с этим дизайном, как вы хотите это сделать. Если вы можете сообщить нам более подробную картину о том, почему вы хотите это сделать, мы можем придумать лучший дизайн, чтобы удовлетворить ваши требования.

Ответ 6

Вы можете копировать только содержимое другого класса, но не устанавливать его напрямую. См. Пример ниже, используя то, что называется конструктором копирования.

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; }
}

Ключ - это ключевое слово base() после объявления конструктора.

Ответ 7

Если вы хотите иметь больше контроля, чем объекты с отраженным копированием, попробуйте применить шаблон Builder. T может быть любым классом, производным от BaseClass.

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