如何在静态基方法中创建继承实例?

时间:2011-11-01 10:06:36

标签: c#

从一个实例中,我可能会这样做。

 var obj= Activator.CreateInstance(GetType());

不知道如何在静态基方法中获取继承类的typeof。

这是最好的前进方式吗?

 public static Method<T>() where T : SomeBase, new()

3 个答案:

答案 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();

至于工厂实现中的代码重复:保存实现者一点点打字是没有意义的。编程中的目标是编写可以读取,理解和轻松修改的代码。节省纸张或按键没有编程目标:)