То, что вы есть почти, но не совсем точно абстрактная фабрика. Я сначала скажу, что вы должны оставить его разработчикам производных классов, чтобы понять это правильно или просто доверять им.
Другой ответ показал так называемый шаблон с любопытным повторяющимся шаблоном. Здесь вы используете базовый класс, который пытается использовать систему типов для обеспечения того, чтобы производные типы использовали себя на определенных позициях ввода или вывода.
public abstract class Foo<T> where T : Foo<T>
public class Bar : Foo<Bar>
Эта идея может работать на других языках. Он работает на C# только в том случае, если люди правильно его используют. С приведенным выше определением Бар теперь можно также получить
public class Baz : Foo<Bar>
Это совершенно законно. Bar
- это Foo<Bar>
, что является обязательным условием для использования Базом. Ничто не требует, чтобы Баз фактически использовал Foo<Baz>
.
Система типов в C# просто не может обеспечить выполнение того, что вы хотели бы применить. Даже с этим рисунком на месте вы все еще находитесь в том же положении, что и раньше. Вы все равно должны доверять разработчикам производных классов, чтобы сделать это правильно.
Для получения дополнительной информации по этой теме, вы можете прочитать this blog.
См. Http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx для подводных камней и проблем, которые необходимо учитывать. –
Спасибо за ссылку. Интересное чтение. – Eric