【问题标题】:Class inheritance & constructors类继承和构造函数
【发布时间】:2012-09-03 21:36:46
【问题描述】:

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

谢谢!

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

【问题讨论】:

  • 你可能想让你的 OtherOrderManager 静态和单例一样。
  • AFAIK,这是不可能的。我建议您在 OtherOrderManager 处编写一个 public static 方法,该方法将返回一个 Order istance
  • 听起来你想要某种工厂模式。 en.wikipedia.org/wiki/Factory_pattern 或可能是“抽象工厂模式”。本质上,当你想要一个Order 时,你不会直接实例化它。相反,您将使用OrderFactory(或者在这种情况下,可能是OtherOrderManager)并说Order order = OrderManager.GetOrder(orderID)。但随后您继续谈论填充另一个订单的信息(克隆?)也许您应该描述一下您的总体最终意图。
  • @ChrisSinclair 是的,你是对的。并且 Order 和 OtherOrder 对我来说对这样的继承关系有点困惑,不确定这是去那里的方式
  • @VincentB。我同意。不确定 Francis 的目标是什么,但我将复制构造函数的快速实现与继承和构造函数链接放在一起。也许这会让一些船浮起来。

标签: c# class inheritance constructor


【解决方案1】:

尽管你想要实现的目标有点模糊,但我猜你可能想要使用类似于使用工厂的东西,可能带有复制构造函数。从本质上讲,复制构造函数提供了一种简单的方法来使用您的副本沿继承链填充数据。

考虑以下基类:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      试试:

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

      希望对您有所帮助。

      【讨论】:

      • _omOtherOrderManager 不是 Order
      猜你喜欢
      • 2014-11-22
      • 2016-03-24
      • 2020-01-12
      • 2013-10-24
      • 2011-12-27
      • 2017-11-17
      • 2020-08-07
      相关资源
      最近更新 更多