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模式。是的,检查工厂模式,可能还有依赖项注入,其中一个应该可以解决您的更高级别问题。使用动态绑定非常适合此类用例。设计模式也使用了类似的技术。