阶级继承&建设者

时间:2012-09-11 01:24:47

标签: c# class inheritance constructor

您好,StackOverflow的所有才华横溢!

我熟悉c#类继承和多个构造函数,但我似乎无法提出一个允许我使用Google的问题。

这就是我所拥有的:

public class Order: OtherOrder
{

    private OtherOrderManager _om;

    public Order()
    {
        if (_om == null)
            _om = new OtherOrderManager();
    }

    public Order(int orderID)
        : base()
    {

    }
}

很明显,现在我可以做类似的事情:

Order order = new Order();
order.Member_From_OtherOrder_Class = "bleh";

但是我正在尝试在构造函数中实现:

public class Order: OtherOrder
{

private OtherOrderManager _om;

public Order()
{
    if (_om == null)
        _om = new OtherOrderManager();
}

public Order(int orderID)
    : base()
{
   this = (Order)_om.GetOrder(orderID); //Returns an instance of OtherOrder
   //Basically, I want to populate all the members of Order() interited
   //from OtherOrder and fill them with data returned by this call.
}

}

显然,“this”是只读的,甚至不能编译。是否有任何技术表达可以描述我正在寻找的东西?它甚至可能吗?

谢谢!

编辑:我想我会使用反射循环遍历所有成员并以这种方式获取/设置值。

3 个答案:

答案 0 :(得分:5)

尽管你想要实现的目标有点含糊不清,但我猜你可能想要使用一些可能与拷贝构造函数一起使用工厂的东西。从本质上讲,复制构造函数提供了一种简单的方法,可以使用副本在继承链中填充数据。

考虑以下基类:

public abstract class OrderBase
{
    public int OrderID { get; private set; }
    public string Name { get; protected set; }

    public OrderBase()
    {

    }

    public OrderBase(OrderBase copiedOrder)
    {
        this.OrderID = copiedOrder.OrderID;
        this.Name = copiedOrder.Name;
    }
}

(我把无参数构造函数留在那里因为我猜它会在某处需要)

因此可以通过传递另一个OrderBase实例来实例化OrderBase。在该构造函数中,我们知道要复制哪些属性并进行编译时检查。

现在一个子类可能是:

public class CustomOrder : OrderBase
{
    public Guid CustomID { get; private set; }

    public CustomOrder()
    {

    }

    public CustomOrder(CustomOrder copiedOrder)
        : base(copiedOrder)
    {
        this.CustomID = copiedOrder.CustomID;
    }
}

此处,CustomOrder仅复制其自身声明的属性,并将其余的复制责任传递给基类。再向链中添加一个类:

public class ValidatableCustomOrder : CustomOrder
{
    public bool IsValid { get; private set; }

    public ValidatableCustomOrder()
    {

    }

    public ValidatableCustomOrder(ValidatableCustomOrder copiedOrder)
        : base(copiedOrder)
    {
        this.IsValid = copiedOrder.IsValid;
    }
}

你可以看到它如何很好地管理每个子类的每个属性集,而没有任何一个类对另一个知道很多。您的工厂可能看起来像:

public static class ValidatableCustomOrderLoader
{
    public static ValidatableCustomOrder Get(int orderID)
    {
        ValidatableCustomOrder loadedOrder = LoadOrderFromSomewhere(orderID);
        ValidatableCustomOrder copiedOrder = new ValidatableCustomOrder(loadedOrder);
        return copiedOrder
    }

    private ValidatableCustomOrder LoadOrderFromSomewhere(int orderID)
    {
        //get your order somehow
    }
}

因此它(以某种方式)加载数据(可能来自数据库),将其复制到一个新实例,该实例将链接所有复制构造函数。您的主叫代码如下:

int orderID = 10;
ValidatableCustomOrder order = ValidatableCustomOrderLoader.Get(orderID);

无论如何,我不能说这是否会专门帮助你,因为你的问题/代码看起来有些偏离模糊,但希望它会帮助你提供一些想法。< / p>

答案 1 :(得分:1)

我想到了两种方法:手动复制属性:

public Order(int orderID)
    : base()
{
   var other = (Order)_om.GetOrder(orderID);
   this.SomeProperty = other.SomeProperty; //repeat for each property/field that should be copied
}

或者使用静态或工厂方法代替构造函数,例如:

public static Order GetOrder(int orderId)
{
    return (Order)_om.GetOrder(orderID);
}

答案 2 :(得分:0)

尝试:

this._om = (Order)_om.GetOrder(orderID);

希望有所帮助。