C#:通用继承工厂

时间:2011-02-21 05:07:06

标签: c# inheritance

我有一个基类,它接受一个通用参数。然后我有几个继承自这个基类的类。子类是否有一种简单的方法来固定基类中的工厂?

实施例

class BaseClass<T>
{
     T Value {get; set;}
     string Name {get; set;}

     public static BaseClass<T> Factory(T Value)
     {
        return new BaseClass<T>(Value); 
     }
}

class ChildClass : BaseClass<int>
{
     public void Test()
     {
         // I want this below to work
         // but Factory() returns a BaseClass
         ChildClass bs = ChildClass.Factory(10);
     }
}

我在代码中注意到了我想要的工作。我可以想出一种方法来解决这个问题,方法是将一个隐式运算符添加到从BaseClass转换为ChildClass的BaseClass或SubClass。

我也可以明确地将Factory添加到ChildClass,但这会破坏继承点。

有没有更好,更标准化的方法呢?

2 个答案:

答案 0 :(得分:8)

我会做这样的事情:

class BaseClass<T, K> where K : BaseClass<T, K>, new()
{
    T Value { get; set; }
    string Name { get; set; }

    public static K Factory(T value)
    {
        return new K { Value = value };
    }
}

class ChildClass : BaseClass<int, ChildClass>
{
    public void Test()
    {
        ChildClass cs = Factory(10);
    }
}

答案 1 :(得分:0)

回答你的问题有点困难,因为你已经描述了你想要做的事情,但不是为什么。因此,我试着猜猜你想要什么。

我不会将工厂方法放在与其他答案或问题相同的类中。你会如何处理一次继承?它适用于您拥有的两个级别。但是如果你想扩展ChildClass怎么办?

相反,我会创建一个用于创建对象的通用工厂。实现它有一个包含在工厂接口周围的单例,以便能够轻松扩展它或交换实现。

class MyFactory
{
    private static IMyFactory _instance;
    public static void Assign(IMyFactory factory) { _instance = factory; }
    public static T Create<T>() { return _instance.Create<T>(); }
}

interface IMyFactory
{
    T Create<T>();
}
class MyFactoryImp : IMyFactory
{
    //do whatever needed in here
    public T Create<T>(){ return new T(); }
}


class BaseClass<T>
{
     T Value {get; set;}
     string Name {get; set;}
}

class ChildClass : BaseClass<int>
{
     public void Test()
     {
         ChildClass bs = MyFactory.Create<ChildClass>(10);
     }
}

// start with this, you can easily switch implementation
MyFactory.Assign(new MyFactoryImp());

另一个明显的答案是开始使用Inversion Of Control容器,例如autofac。