C#多态构造函数
我有一个基类C#多态构造函数,c#,constructor,polymorphism,C#,Constructor,Polymorphism,我有一个基类Item和一个继承自Item的子类Ball public class Item { public string Name { get; set; } public uint ID { get; set; } public Item(ItemData data) { Name = data.Name; ID = data.ID; } } public class Ball : Item { public
Item
和一个继承自Item
的子类Ball
public class Item
{
public string Name { get; set; }
public uint ID { get; set; }
public Item(ItemData data)
{
Name = data.Name;
ID = data.ID;
}
}
public class Ball : Item
{
public float Radius { get; set; }
public Ball(BallData data) : base(data)
{
CatchRate = data.Radius;
}
}
它们是构造函数接受的ItemData
或BallData
对象。与Ball
和Item
一样,BallData
继承自ItemData
:
public class ItemData
{
public string Name { get; set; }
public uint ID { get; set; }
}
public class BallData : ItemData
{
public float Radius { get; set; }
}
现在,我有一个ItemData
对象itemDataObj
。注意,我不知道这是否也是一个BallData
对象(从和XML文件反序列化)。如果itemDataObj
也是BallData
对象,我想让下面的代码创建一个Ball
对象,如果itemDataObj
只是一个ItemData
对象,则创建一个Item
:
new Item(itemDataObj)
基本上,我希望我的构造函数形成一个负责任(多态)的链,其中为相应类型的
ItemData
选择合适的构造函数。实际上,我通过实现GetItem()
方法找到了此特定情况的解决方案:
public class ItemData
{
public string Name { get; set; }
public uint ID { get; set; }
public virtual Item GetItem()
{
return new Item(this);
}
}
public class BallData : ItemData
{
public float Radius { get; set; }
public override Item GetItem()
{
return new Ball(this);
}
}
这样我可以做到:
itemDataObj.GetItem();
分别获取我的
项目
或球
。构造函数不是多态的。“反序列化”代码(例如,由特定的序列化库/框架或工厂读取器方法提供)负责调用正确的构造函数。@user2864740啊,谢谢。那太糟糕了。多态构造函数毫无意义。这是唯一一次你必须知道对象的具体类型。在这种情况下,您将创建一个新球
。ball构造函数可以做出所有必要的决定,包括是否调用基类构造函数以及是否创建BallItemFactory模式。是的,检查工厂模式,可能还有依赖项注入,其中一个应该可以解决您的更高级别问题。使用动态绑定非常适合此类用例。设计模式也使用了类似的技术。