¿Cómo crear instancia de heredado en el método base estático?

De una instancia, podría hacer esto.

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

Sin embargo, no estoy seguro de cómo obtener la tipografía de la clase heredada en un método base estático.

¿Es esta la mejor manera de avanzar?

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

No existe tal cosa como un método estático derivado. Por lo tanto, no hay manera de crear un método de fábrica estático que devuelva un tipo diferente dependiendo de la clase derivada en la que lo llame.

Como lo sugirió Lonli-Lokli, debe usar el patrón de diseño de Abstract Factory .

 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; } } 

Ventajas de Abstract Factory vs static Factory :

  • Es mucho más flexible, permitiendo una nueva implementación de la lógica de su fábrica (que puede ser tan complicada como desee) para cada implementador de la fábrica abstracta. Podrías tener más de una fábrica por clase, si quisieras.
  • Como no está llamando a un método estático, es mucho más fácil de reemplazar en tiempo de ejecución. Esto es bastante útil para inyectar simulacros en pruebas unitarias.

Los pros son enormes. Las fábricas abstractas son superiores a los métodos de fábrica estática en todos los sentidos, incluso si usted pudiera obtener métodos estáticos para que funcionen como usted lo desea.

Contras de Abstract Factory vs métodos estáticos de fábrica :

  • Los usuarios de la fábrica abstracta deben tener una instancia de fábrica para crear sus tipos derivados.
  • Debe escribir una nueva implementación de fábrica abstracta para cada clase derivada.

Los contras son muy marginales.

Es extremadamente fácil para un usuario crear una instancia de una fábrica para crear un solo objeto:

 MyClass myClass = new MyClassFactory().Create(); 

En cuanto a la duplicación de código en la implementación de fábrica: guardar el implementador un poco de escritura no tiene sentido. Es un objective en la progtwigción escribir código que se pueda leer, comprender y modificar fácilmente. No hay un objective de progtwigción para ahorrar papel o pulsaciones de teclas 🙂

Podría hacer que la clase base sea genérica y cerrar el genérico en la clase derivada.

 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(); } } 

Hay algunos que consideran que esto es un “anti-patrón” , pero creo que hay circunstancias en las que es un enfoque aceptable.

¿Tal vez deberías intentar usar un patrón abstracto de fábrica? http://en.wikipedia.org/wiki/Abstract_factory_pattern