假设我有这样的代码
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之间分享这样的课程。
答案 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 { ... }
现在,您有两种选择来实现Equipment
和Inventory
:
直接暴露holded
throgh readonly属性:
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() };
}
这样,您在创建Holded
和Equipment
实例时会注入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]);
}
}