2008-10-24 4 views
7

У меня есть Класс A:Generic контрсилами на производных классах

public class ClassA<T> 

Класс B вытекает из A:

public class ClassB : ClassA<ClassB> 

Класс C является производным от класса B:

public class ClassC : ClassB 

Теперь у меня есть универсальный метод с ограничениями

public static T Method<T>() where T : ClassA<T> 

ОК, теперь я хочу назвать:

ClassC c = Method<ClassC>(); 

, но я получаю ошибку компиляции, говоря: Type argument 'ClassC' does not inherit from or implement the constraint type 'ClassA<ClassC>.

Тем не менее, компилятор позволит:

ClassB b = Method<ClassB>(); 

Я понимаю, что это не удается, потому что ClassC наследует ClassA<ClassB> вместо ClassA<ClassC>

Мой реальный вопрос, можно ли создать класс, производный от ClassB, которые могут быть использованы каким-либо образом с общим методом?

Это может показаться, что дженерики злоупотребляют, и я согласен. Я пытаюсь создать объекты бизнес-уровня, происходящие из дозвуковых объектов данных в отдельном проекте.

Примечание: Я положил < T> с дополнительными пробелами, иначе они будут лишены ответа.

ответ

5

Ну, вы могли бы изменить метод для:

public static T Method<T,U>() where T : ClassA<U> where U : T 

ли это помощь на всех? Это не очень полезно, если вы не можете изменить Метод курса ...

+0

Да, это решает проблему. Фактически этот метод: DB.Get < T > (string primaryColumnValue) T используется для возврата объекта данных из базы данных. Похоже, что становится все сложнее, что это должно быть ... Мне нужно отступить и переосмыслить архитектуру. – ptutt 2008-10-25 12:26:00

2

Нет. Вы должны изменить или обернуть этот метод.

Вот почему.

ClassC наследует от ClassB, который наследует от CLASSA (ClassB)

ClassC не наследует от ClassA (ClassC)

Ни один ребенок из ClassB не будет наследовать от ClassA (класс ребенок), потому что они вместо того, чтобы наследовать от ClassB и ClassB не наследуются от ClassA (дочерний класс).

Generic types are invariant.

1

В большинстве случаев можно решить этот сценарий, имеющий основание необщего абстрактный класс:

public abstract class BasicClassA 
{ 
} 

public class ClassA<T> : BasicClassA 
{ 
} 

public class ClassB : ClassA<ClassB> 
{ 
} 

public class ClassC : ClassB 
{ 
} 

public static T Method<T>() where T : BasicClassA 
{ 
    return null; 
} 

Ваш пробег может варьироваться, однако.

+0

В этом случае это предложение не решает сценарий, потому что в методах «Метод» вызывается ClassA , возвращающий тип T. Спасибо за предложение. – ptutt 2008-10-25 12:21:43

Смежные вопросы