从一个实例中,我可能会这样做。
var obj= Activator.CreateInstance(GetType());
不知道如何在静态基方法中获取继承类的typeof。
这是最好的前进方式吗?
public static Method<T>() where T : SomeBase, new()
答案 0 :(得分:4)
您可以使基类通用并关闭派生类中的泛型。
public abstract class CreatorOf<T> where T : CreatorOf<T>
{
public static T Create()
{
return (T)Activator.CreateInstance(typeof(T));
}
}
public class Inheritor : CreatorOf<Inheritor>
{
public Inheritor()
{
}
}
public class Client
{
public Client()
{
var obj = Inheritor.Create();
}
}
有些人认为这是"anti-pattern",但我相信在某些情况下这是一种可接受的做法。
答案 1 :(得分:3)
也许你应该更好地尝试使用抽象工厂模式? http://en.wikipedia.org/wiki/Abstract_factory_pattern
答案 2 :(得分:2)
没有派生静态方法。因此,无法创建一个静态工厂方法,该方法根据您调用它的派生类返回不同的类型。
正如Lonli-Lokli建议的那样,你应该使用the Abstract Factory design pattern。
public interface ISomething
{
void DoSomething();
}
public class SomeClass : ISomething
{
public virtual void DoSomething() { Console.WriteLine("SomeClass"); }
}
public class SomeDerivedClass : SomeClass
{
private int parameter;
public SomeDerivedClass(int parameter)
{
this.parameter = parameter;
}
public virtual void DoSomething()
{
Console.WriteLine("SomeDerivedClass - {0}", parameter);
base.DoSomething();
}
}
public interface IFactory
{
public ISomething Create();
}
public class SomeClassFactory : IFactory
{
public ISomething Create() { return new SomeClass(); }
}
public class SomeDerivedClassFactory : IFactory
{
public ISomething Create() { return new SomeDerivedClass(SomeParam); }
public int SomeParam { get; set; }
}
抽象工厂的优点与静态工厂方法:
专业人士是巨大的。抽象工厂在各方面都优于静态工厂方法,即使你可以按照你想要的方式使用静态方法。
抽象工厂与静态工厂方法的缺点:
缺点很少。
用户可以非常轻松地实例化工厂来创建单个对象:
MyClass myClass = new MyClassFactory().Create();
至于工厂实现中的代码重复:保存实现者一点点打字是没有意义的。编程中的目标是编写可以读取,理解和轻松修改的代码。节省纸张或按键没有编程目标:)