繁体   English   中英

C#两次继承相同的类

[英]C# Inheritance of same class twice

假设我有这样的代码

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!”的字符串。 现在,我要实现的是在两个类中都具有相同的基类(已保留)。 因此,如果要从清单中更改holdedID,则Equipment的writeHoldedID函数将输出“ Holded ID is:100!”。 谢谢并恭祝安康!

@Edit:更详细:我有一个游戏。 每个人都是一个角色,拥有设备,库存和货运类别。 每个类别包含约20个“项目”插槽。 现在的事情是,如果您尝试移动一个项目,例如。 从存货到设备,还有物料的索引,然后物料被“交换”-被保留,现在我可以将这样的物料投入设备,库存或货物中。 这就是为什么我需要在Eq / Inv / Cargo之间共享此类课程。

使用这种继承结构,您所要求的是99.9%的可能性。

创建Inventory对象时,还将创建具有其自己的holdedID成员的Holded对象。 创建Equipment对象时, Holded获得一个新的 Holded对象,与旧的对象没有任何关系 因此,对一个对象成员的更改不会影响另一对象, 而您需要这种方式

*要清楚,创建派生类时不会得到单独的Holded对象,但是按照我描述它的方式来考虑它可能会有所帮助。

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

现在,我说这不可能达到99.9%。 可以将基类成员标记为static ,以便在Holded (和派生类)的所有实例之间共享基类成员,从而使代码成为可能。 但是,您实际上几乎没有任何机会要执行此操作 仅当您了解面向对象的设计及其使用的后果时,才应使用static

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

您可以按照以下方式进行操作:

public interface IHolded
{
     Bar Foo();
}

public class Holded: IHolded { ... }

现在,您可以通过两种方式对EquipmentInventory进行清算:

  1. 直接公开holded throgh只读属性:

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

这样,您在创建“ Equipment和“ Inventory实例时将注入一个Holded对象,以确保两个实例中的状态都一致。

用于存储人员及其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]);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM