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

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

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

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

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

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

+2

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

+0

Хотя вопрос не задает вопрос об отражении (или конструкторе-копии) как есть, я добавил теги, чтобы, надеюсь, создать более интересный список связанных вопросов. Наслаждаться. (http://stackoverflow.com/questions/3072518/can-reflection-be-used-to-instantiate-an-objects-base-class-properties выглядит особенно интересным и, возможно, дублирующим) –

+0

Я подозреваю, что вы предполагаете, что C# является языком * наследования прототипа. Это не. Есть ли у вас опыт программирования в JavaScript случайно? –

ответ

0

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

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

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

3

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

Вам необходимо вручную установить свойства.

+0

Допустим, у меня есть класс человека, и, конечно, есть тысячи элементов данных, которые представляют класс человека. Класс человека определяет десять тысяч свойств. Теперь у меня есть идентификатор человека, который ассоциируется с определенным классом человека, из которого я хочу извлечь и создать класс «Джон», наследуемый от человека. Теперь я знаю конкретный идентификатор человека, который хочу пройти, и это будет основой «Джона». – Watson

+0

Вы можете сделать оболочку вместо использования наследования. – SLaks

3

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

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

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

Должен ли я спросить, какова ваша цель?

+0

Моя цель проста. В принципе, в реальной жизни Supercar, вероятно, будет иметь 100 свойств. Так что скажем, теперь я поддерживаю базу данных суперкаров.Теперь, я хочу наследовать от суперкаров, но я хочу передать базовый класс суперкаров, которые я уже создал для простоты. Я не хочу вручную устанавливать 100 свойств, если у меня есть УЖЕ созданный базовый тип. – Watson

+0

Похоже, вам нужно разбить SuperCar на более мелкие объекты. Тогда объекты, которые являются одинаковыми между SuperCars, могут совместно использоваться. – siride

+0

Я больше беспокоюсь о своем понимании наследования в C#. Мне просто кажется, что если класс A происходит из класса B, вы должны установить B на A. Поэтому, если у вас есть экземпляр класса A, вы должны иметь возможность сказать A.B = new B(); – Watson

0

Прежде всего, каждый объект 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; 
    } 
} 

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

0

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

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() после объявления конструктора.

9

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

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

Да. Это было прекрасно. – Watson

0

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

public static T BuildNew<T>(BaseClass baseClass) where T : BaseClass, new() 
{ 
    return new T 
    { 
     Property1 = baseModel.Property1, 
     Property2 = baseModel.Property2, 
    }; 
} 
Смежные вопросы