restrições genéricas sobre as classes derivadas
-
04-07-2019 - |
Pergunta
eu tenho classe A:
public class ClassA<T>
deriva da Classe B de A:
public class ClassB : ClassA<ClassB>
<> fortes Classe C deriva da classe B:
public class ClassC : ClassB
Agora eu tenho um método genérico com restrições
public static T Method<T>() where T : ClassA<T>
OK, agora eu quero chamar:
ClassC c = Method<ClassC>();
mas eu recebo o erro de compilação dizendo:
Type argument 'ClassC' does not inherit from or implement the constraint type 'ClassA<ClassC>.
No entanto, o compilador irá permitir:
ClassB b = Method<ClassB>();
O meu entendimento é que esta falha porque herda ClassC
ClassA<ClassB>
vez de ClassA<ClassC>
A minha pergunta real é, é possível criar uma classe que deriva de ClassB
que pode ser usado de alguma forma com o método genérico?
Isto pode parecer genéricos são usado em demasia e eu concordo. Eu estou tentando criar camada de objetos de negócios decorrentes dos objetos de dados subsônicos em um projeto separado.
Nota:. Eu coloquei o
Solução
Bem, você poderia alterar o método para:
public static T Method<T,U>() where T : ClassA<U> where U : T
Será que isso ajuda em tudo? Não é muito útil se você não pode mudar o método, é claro ...
Outras dicas
No. Você deve alterar ou envolva este método.
Aqui está a razão.
herda ClassC de ClassB que herda de ClasseA (ClassB)
ClassC não herda de ClassA (ClassC)
Nenhum filho de ClassB vai herdar de ClassA (classe infantil), porque em vez herdar de ClassB e não ClassB não herdar de ClassA (classe infantil).
Na maioria dos casos é possível resolver esse cenário por ter uma classe abstrata de base não-genérico:
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;
}
Sua milhagem pode variar, no entanto.