Вопрос

У меня класс А:

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> с дополнительными пробелами, иначе они будут исключены из вопроса.

Это было полезно?

Решение

Ну, вы можете изменить метод на:

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

Помогает ли это вообще? Это не очень полезно, если вы не можете изменить метод, конечно ...

Другие советы

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

Вот причина.

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

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

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

Универсальные типы инвариантны..

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

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;
}

Тем не менее, ваш пробег может отличаться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top