Pregunta

Tengo clase A:

public class ClassA<T>

Clase B deriva de A:

public class ClassB : ClassA<ClassB>

La clase C deriva de la clase B:

public class ClassC : ClassB

Ahora tengo un método genérico con restricciones

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

OK, ahora quiero llamar:

ClassC c = Method<ClassC>();

pero aparece el error de compilación que dice: Type argument 'ClassC' does not inherit from or implement the constraint type 'ClassA<ClassC>.

Sin embargo, el compilador permitirá:

ClassB b = Method<ClassB>();

Entiendo que esto falla porque ClassC hereda ClassA<ClassB> en lugar de ClassA<ClassC>

Mi verdadera pregunta es, ¿es posible crear una clase derivada de ClassB que pueda usarse de alguna manera con el método genérico?

Esto puede parecer que los genéricos se usan en exceso y estaría de acuerdo. Estoy tratando de crear objetos de capa empresarial derivados de los objetos de datos subsónicos en un proyecto separado.

Nota: He puesto el < T & Gt; con espacios adicionales, de lo contrario quedan despojados de la pregunta.

¿Fue útil?

Solución

Bueno, podrías cambiar el Método a:

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

¿Ayuda eso? No sirve de mucho si no puedes cambiar el método, por supuesto ...

Otros consejos

No. Debe cambiar o ajustar este método.

Aquí está la razón.

ClassC hereda de ClassB que hereda de ClassA (ClassB)

ClassC no hereda de ClassA (ClassC)

Ningún elemento secundario de ClassB heredará de ClassA (clase secundaria), porque en su lugar heredará de ClassB y ClassB no heredará de ClassA (clase secundaria).

Los tipos genéricos son invariantes .

En la mayoría de los casos, es posible resolver este escenario teniendo una clase abstracta no genérica base:

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

Sin embargo, su kilometraje puede variar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top