Я не совсем уверен, что вы ищете, но на основе нескольких подсказок в вашем вопросе вы можете рассмотреть что-то вроде следующего (обозначаемого в качестве Curiously Recurring Template Pattern):
public abstract class MyBaseClass<T> : where T : MyBaseClass<T>
{
public abstract T[] Search(string search);
}
public class DerivedClass : MyBaseClass<DerivedClass>
{
public override DerivedClass[] Search(string search)
{
return new DerivedClass[0];
}
}
Это возможно, но я не уверен, если это то, что вы ищете, и я бы обзор, чтобы увидеть, если это был хороший выбор дизайна или нет, он чувствует немного просачивается.
Эта конкретная идея используется в таких инфраструктурах, как CSLA.NET, чтобы подвергать производному классу сильные ссылки на себя при наследовании от определенных базовых классов. Это, как правило, «синтаксический сахар», и он не позволяет бросать много, чтобы использовать вещи по своему типу при их из базовых классов. Сам базовый класс по-прежнему не должен понимать, какие типы происходят от него.
Eric Lippert talks about this pattern on his old MS blog. У этого есть свои подводные камни, и он раскрывает то, как его можно злоупотреблять. Я лично придерживаюсь подхода, что осознание этих ошибок и возможностей для злоупотреблений является достаточно хорошим, пока все проверено. Я счастлив использовать что-то, что может противоречить рекомендациям или принципам, если это ясно (нет достаточно дополнительной информации, чтобы понять, ясно ли это в данном конкретном случае). Задания Eric:
Все, что сказало, на практике бывают случаи, когда использование этого шаблона действительно прагматично решает проблемы способами, которые трудно моделировать иначе в C#; это позволяет вам немного обойти тот факт, что у нас нет ковариантных типов возврата для виртуальных методов и других недостатков системы типов. То, что он делает это таким образом, который, строго говоря, не принуждает к любым ограничениям, которые могут вам понравиться, является неудачным, но в реалистичном коде обычно не является проблемой, которая препятствует доставке продукта.
Мой совет - подумать очень сложно, прежде чем реализовать этот вид любопытный шаблон в C#; делать преимущества для клиента действительно перевешивают расходы, связанные с ментальной нагрузкой, которую вы размещаете по коду ?
Лучшее использование этого шаблона, который я видел, оставил все повторяющиеся части внутренними или защищенными, а общедоступный API остался один.
Укажите _extend_. Почему бы вам не заменить «this' на фактическое имя класса? –
Почему вы не можете использовать фактическое имя класса? 'public MyClass [] search (string s) {}' – noelicus
Вы не можете и не должны. Это признак неправильного дизайна и непонимания ООП. – Euphoric