[英]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 { ... }
现在,您可以通过两种方式对Equipment
和Inventory
进行清算:
直接公开holded
throgh只读属性:
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]);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.