我有一个基类,它接受一个通用参数。然后我有几个继承自这个基类的类。子类是否有一种简单的方法来固定基类中的工厂?
实施例
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,但这会破坏继承点。
有没有更好,更标准化的方法呢?
答案 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。