C#两次相同类的继承

时间:2015-09-30 00:20:15

标签: c# inheritance

假设我有这样的代码

public class Holded
{
    protected internal int holdedID = 0;
}

public class Inventory : Holded
{
    public Inventory() { }

    public void changeHoldedID()
    {
        this.holdedID = 100;
    }
}

public class Equipment : Holded
{
    public Equipment() { }

    public void writeHoldedID()
    {
        Console.WriteLine("Holded ID is: {0}!", this.holdedID);
    }
}

public class Cargo : Holded
{
    public Cargo() { }
}

如果我调用changeHoldedID然后调用writeHoldedID,控制台仍会输出类似“Holded ID is:0!”的字符串。现在我想要实现的是在两个类中都有相同的基类(Holded)。因此,如果我从库存中更改holdedID,则设备的writeHoldedID函数将输出“Holded ID is:100!”。谢谢和问候!

@Edit:更详细:我有一个游戏。每个人都是一个角色,拥有设备,库存和货物类。每个类包含大约20个“项目”的插槽。现在问题是,如果你试图移动一个项目,那么前。从库存到设备,还有这样的物品索引,然后物品被“交换” - 变得坚固,现在我可以把这样的物品扔进设备,库存或货物。这就是为什么我需要在Eq / Inv / Cargo之间分享这样的课程。

3 个答案:

答案 0 :(得分:3)

使用这种继承结构,你要问的是99.9%不可能。

创建Inventory对象时,您还创建了一个Holded个对象,其中包含自己的holdedID成员。当您创建Equipment对象时,您还会获得 Holded对象,与无关系。因此,对一个对象成员的更改不会影响另一个,并且您希望以这种方式

*要明确的是,在创建派生类时,您没有获得单独的Holded对象,但以我描述的方式来思考它可能会有所帮助。

我不知道你为什么要做你想要的事情,但是你需要重新理解继承,对象和变形,这是一个很好的选择。

现在,我说这是99.9%不可能的。 可以标记基类成员static,它在{em>所有 Holded实例(和派生类)之间共享它,使您的代码成为可能。 但是,你几乎没有机会想要这样做static只应在理解面向对象设计及其使用后果时使用。

答案 1 :(得分:1)

您是否考虑过,“是继承类型关系而”包含“关系?

你可以按照以下几点做点什么:

public interface IHolded
{
     Bar Foo();
}

public class Holded: IHolded { ... }

现在,您有两种选择来实现EquipmentInventory

  1. 直接暴露holded throgh readonly属性:

     public class Inventory
     {
         public Inventory(IHolded holded) { ... }
         public IHolded Holded { get; }
     }
    
  2. 让他们实现IHolded接口并委派 实施到holded

    public Equipment
    {
         private readonly IHolded holded;
    
         public Equipment(IHolded holded) { this.holded = holded; }
    
         public Bar Foo() { return holded.Foo() };
    }
    
  3. 这样,您在创建HoldedEquipment实例时会注入Inventory个对象,从而确保两个实例中的状态一致。

答案 2 :(得分:0)

存储此人及其HoldedId的词典可能有效

public class Holded
{
    protected internal static Dictionary<string, int> _personHoldedIDs;
    internal string _person;

    public Holded(string person)
    {
        _person = person;

        if (_personHoldedIDs == null)
            _personHoldedIDs = new Dictionary<string, int>();

        if (!_personHoldedIDs.ContainsKey(_person))
            _personHoldedIDs.Add(_person, 0);
    }
}

public class Inventory : Holded
{
    public Inventory(string person) : base(person) { }

    public void changeHoldedID()
    {
        _personHoldedIDs[_person] = 100;
    }
}

public class Equipment : Holded
{
    public Equipment(string person) : base(person) { }

    public void writeHoldedID()
    {
        Console.WriteLine("Holded ID is: {0}!", _personHoldedIDs[_person]);
    }
}