21
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 对象,我认为这是你可以做到的唯一方法,但如果你可以用其他方式做到这一点会好很多。

4

7 回答 7

14

我在子类中使用了类似的东西,它对我来说很好:

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);
    }
}
于 2013-09-25T16:16:11.380 回答
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);
}

请注意,您必须在“复制”构造函数中非常小心,不要以两个对象在不应该共享相同成员(引用)的方式复制属性。

不过,我不得不问,你的目标是什么?

于 2011-01-28T01:22:37.927 回答
2

这是不可能的。

您需要手动设置属性。

于 2011-01-28T01:05:30.100 回答
2

只能复制另一个类的内容,不能直接设置。请参阅下面使用所谓的复制构造函数的示例。

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 : Car
{
    public SuperCar(Car car) : base(car) { }
    public SuperCar(string model) : base(model) { }
    bool IsTurbo { get; set; }
}

关键是base()构造函数声明后的关键字。

于 2011-01-28T02:33:15.797 回答
1

总的来说,有很多有用的评论。我认为 pst 给出了简短的回答,我认为这是正确的:

没有。简短的原因:没有单独的基础对象。(object)this == (object)base 始终为真。不过,有一些方法可以通过反射(和其他方式)执行克隆/复制。也许描述真正想要的东西

所以,他关于使用 automapper 工具的建议也非常有用,基本上就是我想要的。

于 2011-10-17T23:32:27.270 回答
0

首先,每个 SuperCar 对象都彼此不同。继承帮助您定义相关对象的共同行为,这并不意味着它们是相同的对象。一个类型的每个对象都有自己的构造过程。在创建子对象之前,根据继承层次结构创建基类对象。如果您希望对所有 SuperCar 对象使用公共属性,则需要在 SuperCar 实例中维护 Car 对象的单独实例,将公共汽车对象分配给 SuperCar 中的汽车对象并覆盖从基础 Car 派生的属性对象并将其重定向到道具。内部 Car 对象。

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

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

但我仍然相信,按照您想要的方式,这种设计有问题。如果您可以让我们更全面地了解您为什么要这样做,我们可能会提出更好的设计来满足您的要求。

于 2011-01-28T01:26:15.013 回答
0

如果您希望拥有比复制反射属性更多的控制权,请尝试应用 Builder 模式。T 可以是从 BaseClass 派生的任何类。

 public static T BuildNew<T>(BaseClass baseClass) where T : BaseClass, new()
 {
    return new T
    {
        Property1 = baseModel.Property1,
        Property2 = baseModel.Property2,
    };
 }
于 2017-11-04T04:51:43.310 回答