我可以在长继承链中调用子类的顶级构造函数吗?

时间:2013-07-31 11:24:21

标签: c# inheritance constructor

这是我的链条:

public abstract class Item ->
  public abstract class MiscItem ->
    public abstract class OtherItem ->
       public class TransformableOther;

Item中,有一个复制构造函数:

public Item (Item other)
{
 // copy stuff ...
}

我想这样做:

var trans = new TransformableOther (otherItem);

当然这没用,我去了TransformableOther尝试了:

public TransformableOther(Item other): base (other) {}

但是这种方式不起作用,当然那只是直接调用直接在上面的父母。我去了OtherItem并做了同样的事情,所以对于它的父MiscItem, 它不起作用。

我怎样才能实现我想要的目标? - 如果我不能,那么这个黑客是什么?

感谢。

编辑:我的不好,出于某种原因,在我的代码中我正在做base.Item(otherItem)而不是base(otherItem)这实际上就是我在问题中所写的内容。

2 个答案:

答案 0 :(得分:1)

在C#中,没有办法做你想要的。基本上,您只能调用您直接继承的类的构造函数。

如果您可以控制Item的实现,那么我认为最好的解决方法是使用虚拟克隆/复制方法而不是复制构造函数,这样即使{{{}也可以覆盖该方法1}}和MiscItem不提供自己的实现。

答案 1 :(得分:1)

这很有效。

public abstract class Item
{
    private Item other;
    public Item(Item item)
    {
        System.Diagnostics.Debug.WriteLine("Creating Item!");
        other = item;
    }

    public abstract class MiscItem : Item
    {
        public MiscItem(Item item) : base(item)
        {

        }

        public abstract class OtherItem : MiscItem
        {
            public OtherItem(Item item) : base(item)
            {

            }

            public class TransformableOther : OtherItem
            {
                public TransformableOther() : base(null)
                {

                }

                public TransformableOther(Item item) : base(item)
                {

                }

            }
        }
    }
}

然后你可以用

测试它
         Item.MiscItem.OtherItem.TransformableOther other = new Item.MiscItem.OtherItem.TransformableOther();
        var item = new Item.MiscItem.OtherItem.TransformableOther(other);