类继承和构造函数

Fra*_*rme 2 c# inheritance constructor class

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

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

这就是我所拥有的:

public class Order: OtherOrder
{

    private OtherOrderManager _om;

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

    public Order(int orderID)
        : base()
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

显然,现在我可以这样做:

Order order = new Order();
order.Member_From_OtherOrder_Class = "bleh";
Run Code Online (Sandbox Code Playgroud)

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

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.
}
Run Code Online (Sandbox Code Playgroud)

}

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

谢谢!

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

Chr*_*air 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

现在一个子类可能是:

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

    public CustomOrder()
    {

    }

    public CustomOrder(CustomOrder copiedOrder)
        : base(copiedOrder)
    {
        this.CustomID = copiedOrder.CustomID;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,CustomOrder只复制它自己在其上声明的属性,并将其余的复制责任传递给基类.再向链中添加一个类:

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

    public ValidatableCustomOrder()
    {

    }

    public ValidatableCustomOrder(ValidatableCustomOrder copiedOrder)
        : base(copiedOrder)
    {
        this.IsValid = copiedOrder.IsValid;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

int orderID = 10;
ValidatableCustomOrder order = ValidatableCustomOrderLoader.Get(orderID);
Run Code Online (Sandbox Code Playgroud)

无论如何,我不能说这是否会特别对你有所帮助,因为你的问题/代码看起来有些偏离模糊,但希望它会帮助你提供一些想法.