【发布时间】:2015-11-19 09:17:22
【问题描述】:
在我解释我的问题之前,请记住,我选择了这样的架构,因为这将在 Unity 下的库存系统中使用,所以我必须将 Item 分开,这是一个 MonoBehavior,它只是来自其数据的世界上的某些东西,这些只是用于库存目的的值......如果这有意义的话。
我的架构是这样的:
public class ItemData
{
// some fields...
public string _name; //should be private with its properties but it doesn't matter in the current example
}
public class EquipmentData : ItemData
{
// some additional fields...
public float _weight;
}
public class Item
{
private ItemData _data;
//Properties
public virtual ItemData Data { get; set; }
}
public class Equipment : Item
{
//Properties
public override ItemData Data
{
get { return _data as EquipmentData; }
set { _data = value as EquipmentData; }
}
}
所以,基本上我有一个更深的项目层次结构,但 1 级足以解释我自己。 (它一直像武器:装备一样)......
问题是,如果我将private ItemData _data; 留在Item 类中,并在Equipment 类中添加private EquipmentData _eData;,我将拥有ItemData 字段两次,因为EquipmentData 继承ItemData 等等对于其他派生类...如果我有一个派生自 Equipment 等的类,请第三次获得它...
类似:
public class Item
{
private ItemData _data;
}
public class Equipment : item
{
private EquipmentData _eData;
}
ItemData 的字段如_name 将在Equipment 中出现两次,我不希望这样...
所以我猜我的架构有问题,并且可能有一种方法可以绕过这种看起来有点“脏”的方法,但我在网上找不到任何特定于这个问题的东西,我已经达到了我的极限.
我尝试过的:
- 我曾尝试在
Equipment中使用关键字new,我认为我可以隐藏Item类中的初始protected ItemData _data;,然后在protected new EquipmentData _data;中添加protected new EquipmentData _data;,但它显然不会让我,因为对于 Shadow _data 它需要是相同的类型,似乎不适用于派生类型。 - 另外,如我的代码示例所示,我已尝试覆盖该属性以根据调用它的类返回正确的类型,强制转换始终返回
null...
我仍然觉得奇怪的是,我最终尝试实现类似的东西,所以我乐于接受以更好的方式重组事物的新想法,或者如果有人有我没想过的解决方案来保留那些方式,但让他们工作,这将是非常好的。
我希望我的问题足够详细,如果没有,我可以在需要时解决问题。
【问题讨论】:
-
您目前的设计有什么问题?为什么
privateitemdata 而不是protected? -
因为无论如何我都是通过属性访问它的。我试图覆盖属性以使每个派生类都具有相同的字段,但通过覆盖每个派生类中的属性来从属性中返回该字段的强制转换版本。参考文献我的代码 sn-p 问题是,转换总是返回 null,因为它没有成功将
EquipmentData转换为ItemData... -
我猜你在被覆盖的道具中做相反的事情,这是行不通的。请参阅下面的回复。
标签: c# inheritance unity3d architecture overriding