C# 同一类的继承两次

本文关键字:继承 两次 一类 | 更新日期: 2023-09-27 18:15:16

假设我有这样的代码

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(。因此,如果我从库存中更改持有ID,设备的writeHoldedID函数将输出"持有ID为:100!谢谢和问候!

@Edit:更详细:我有一个游戏。每个人都是一个角色,拥有装备、库存和货物职业。每个类包含大约 20 个"物品"插槽。现在的问题是,如果你尝试将一个项目(例如从库存(移动到设备,并且有这样的项目索引,那么该项目将被"交换"——被保留,现在我可以将此类保留的项目扔到设备、库存或货物中。这就是为什么我需要在 Eq/Inv/Cargo 之间共享这样的类。

C# 同一类的继承两次

有了这种继承结构,你所要求的是99.9%不可能的。

创建 Inventory 对象时,也会创建具有自己的holdedID成员的Holded对象。创建Equipment对象时,也会获得一个新的Holded对象,与旧对象无关。因此,对一个对象成员的更改不会影响另一个对象成员,并且您希望这样做

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

我不知道你为什么要做你所要求的,但你需要重新设计你对继承、对象和多态的理解,这是一个很好的赌注。

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

您是否考虑过,">是否">继承类型关系是"包含">关系?

您可以执行以下操作:

public interface IHolded
{
     Bar Foo();
}
public class Holded: IHolded { ... }

现在,您有两种选择来表达EquipmentInventory

  1. 通过只读属性直接公开holded

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

这样,您可以在创建EquipmentInventory实例时注入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]);
    }
}