2015-08-20 2 views
1

Я такой ситуацииБазовый общий класс с автоматическим T от унаследованной сына типа

abstract class Foo<T> 
{ 
    // Implementation using T type... 
} 
class Bar : Foo<Bar> 
{ } 

Каждый класс, который наследует от Foo использует себя в качестве общего типа, и у меня есть различные наследственные классы, например: «планкой1 "," Bar2 "и т. Д.

Возможно ли реализовать класс Foo, автоматически беря в действие тип родового типа из унаследованного типа?

ответ

3

Если вы хотите ограничитьT так, что каждый правопреемником является Foo<T>, то вы можете сделать:

abstract class Foo<T> where T:Foo<T> 
{ 
    // Implementation using T type... 
} 
class Bar : Foo<Bar> 
{ } 

Обратите внимание, что это не 100% гарантия, что любой класс S унаследовав от Foo является Foo<S>, потому что вы можно еще сделать:

Что еще удовлетворяет родовое ограничение, потому что Bar является Foo<Bar>, однако Quux является неFoo<Quux>

+0

он сформулировал это плохо, но я думаю, вы прибили его – Jonesopolis

+0

+1 для этого ответа. Однако остерегайтесь этого: http://stackoverflow.com/questions/31771282/cannot-convert-from-foof-to-f#comment51562976_31771282 вопрос. Если автор пытается гарантировать, что 'T' является * текущим * подклассом' Foo', с помощью 'Foo', то этого в настоящее время невозможно гарантировать это. Я отправил предложение команде Roslyn добавить новое ограничение типа для решения этой проблемы. См. Здесь: https://github.com/dotnet/roslyn/issues/4332 Пожалуйста, звоните, если вы считаете, что это важно. –

0

Если это общая реализация, то да. Если реализация различна для разных типов, то нет.

Для общей реализации просто поместите общее поведение в абстрактный базовый класс в соответствии с шаблоном метода шаблонов.

abstract class Foo<T> 
{ 
    public void DoStuff(T obj) 
    { 
     ...implementation... 
    } 
} 
Смежные вопросы