2

向 StackOverflow 的所有聪明才智致敬!

我越来越熟悉 c# 类继承和多个构造函数,但我似乎无法说出一个可以让我谷歌它的问题。

这是我所拥有的:

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”是只读的,因此甚至无法编译。是否有任何技术表达可以描述我正在寻找的东西?甚至可能吗?

谢谢!

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

4

3 回答 3

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

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

所以 anOrderBase可以通过传递另一个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);

无论如何,我不能说这是否会对您有特别的帮助,因为您的问题/代码似乎有点离题和模糊,但希望它能帮助您提供一些想法。

于 2012-09-11T01:47:56.040 回答
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);
}
于 2012-09-11T01:29:41.063 回答
0

尝试:

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

希望有帮助。

于 2012-09-11T01:27:42.813 回答