lo que tienes es casi, pero no exactamente, una fábrica abstracta. Primero diré que debe dejarlo en manos de los implementadores de las clases derivadas para hacerlo bien, o simplemente confiar en que lo harán.
Otra respuesta ha demostrado lo que se conoce como el patrón de plantilla curiosamente recurrente . Es donde tiene una clase base que intenta usar el sistema de tipos para hacer cumplir que los tipos derivados se usan en ciertas posiciones de entrada o salida.
public abstract class Foo<T> where T : Foo<T>
public class Bar : Foo<Bar>
Esta idea podría funcionar en otros idiomas. Funciona en C# solo en la medida en que la gente lo use correctamente. Con la definición anterior de bar, ahora también puedo tener
public class Baz : Foo<Bar>
Cuál es perfectamente legal. Bar
es un Foo<Bar>
, que es todo lo que se requiere para que Baz lo use. Nada requiere que Baz realmente use Foo<Baz>
.
El sistema de tipos en C# simplemente no puede hacer cumplir lo que le gustaría hacer cumplir. Incluso con este patrón en su lugar, todavía está en la misma posición que antes. Aún debe confiar en los implementadores de las clases derivadas para hacerlo correctamente.
Para obtener más información sobre este tema, puede leer this blog.
Consulte: http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx para conocer las dificultades y los desafíos a tener en cuenta. –
Gracias por el enlace. LecturA INTERESANTE. – Eric