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 之间共享这样的类。
有了这种继承结构,你所要求的是99.9%不可能的。
创建 Inventory
对象时,也会创建具有自己的holdedID
成员的Holded
对象。创建Equipment
对象时,也会获得一个新的Holded
对象,与旧对象无关。因此,对一个对象成员的更改不会影响另一个对象成员,并且您希望这样做。
*需要明确的是,在创建派生类时不会获得单独的Holded
对象,但以我描述的方式思考它会有所帮助。
我不知道你为什么要做你所要求的,但你需要重新设计你对继承、对象和多态的理解,这是一个很好的赌注。
现在,我说这99.9%是不可能的。您可以标记基类成员static
基类成员,该成员在Holded
的所有实例(和派生类(之间共享它,从而使您的代码成为可能。但是,您几乎没有机会真正想要这样做。 只有当您了解面向对象设计及其使用的后果时,才应使用static
。
您是否考虑过,">是否">继承类型关系是"包含">关系?
您可以执行以下操作:
public interface IHolded
{
Bar Foo();
}
public class Holded: IHolded { ... }
现在,您有两种选择来表达Equipment
和Inventory
:
通过只读属性直接公开
holded
:public class Inventory { public Inventory(IHolded holded) { ... } public IHolded Holded { get; } }
让他们实现
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]);
}
}