如何在静态基方法中创建inheritance实例?
从一个实例中,我可能会这样做。
var obj= Activator.CreateInstance(GetType());
不知道如何在静态基方法中获取inheritance类的typeof。
这是前进的最佳方式吗?
public static Method() where T : SomeBase, new()
没有衍生的静态方法。 因此,无法创建一个静态工厂方法,该方法根据您调用它的派生类返回不同的类型。
正如Lonli-Lokli建议的那样,您应该使用抽象工厂设计模式 。
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; } }
抽象工厂与静态工厂方法的优点 :
- 它更加灵活,允许为抽象工厂的每个实现者实现工厂逻辑的新实现(可能会如您所希望的那样复杂)。 如果你愿意,你可以为每个class级设置多个工厂。
- 由于您没有调用静态方法,因此在运行时更容易更换。 这对于在unit testing中注入模拟非常有用。
专业人士是巨大的。 抽象工厂在各方面都优于静态工厂方法,即使您可以按照您希望的方式使用静态方法。
抽象工厂与静态工厂方法的缺点 :
- 抽象工厂的用户必须具有工厂实例才能创建派生类型。
- 您必须为每个派生类编写一个新的抽象工厂实现。
缺点很少。
用户可以非常轻松地实例化工厂以创建单个对象:
MyClass myClass = new MyClassFactory().Create();
至于工厂实现中的代码重复:保存实现者一点点打字是没有意义的。 编程中的目标是编写可以读取,理解和轻松修改的代码。 节省纸张或按键没有编程目标:)
您可以使基类通用并在派生类中关闭generics。
public abstract class CreatorOf where T : CreatorOf { public static T Create() { return (T)Activator.CreateInstance(typeof(T)); } } public class Inheritor : CreatorOf { public Inheritor() { } } public class Client { public Client() { var obj = Inheritor.Create(); } }
有些人认为这是一种“反模式” ,但我相信在某些情况下这是一种可接受的方法。
也许你应该更好地尝试使用抽象工厂模式? http://en.wikipedia.org/wiki/Abstract_factory_pattern