Производный и базовый класс, могу ли я установить базу явно?
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,
};
}