Como especificar restrição de tipo e herança ao declarar classe?
-
12-12-2019 - |
Pergunta
Eu tenho um abstract
classe que possui uma restrição de tipo.Mas eu também quero fazer o abstract
classe implementa uma interface.
Por exemplo:
public abstract class PostEvent<TPost> : IDomainEvent, where TPost : Post, new()
O que não compila.
Eu não quero isso:
public abstract class PostEvent<TPost> where TPost : Post, IDomainEvent, new()
Porque isso significa TPost : IDomainEvent
Eu quero PostEvent : IDomainEvent
Qual é a sintaxe?
Solução
Experimente isto:
public abstract class PostEvent<TPost> : IDomainEvent where TPost : Post, new()
Você não quer uma vírgula entre a lista de interfaces e as restrições genéricas.
Outras dicas
Você precisa realmente implementá-lo (você não pode deixar a implementação puramente aos tipos concretos - precisa saber por onde começar):
public abstract class PostEvent<TPost> : IDomainEvent
where TPost : Post, new()
{
public abstract void SomeInterfaceMethod();
}
Você também pode usar uma implementação de interface explícita e um método abstrato protegido se não quiser o Otis na API pública:
public abstract class PostEvent<TPost> : IDomainEvent
where TPost : Post, new()
{
protected abstract void SomeInterfaceMethod();
void IDomainEvent.SomeInterfaceMethod() {
SomeInterfaceMethod(); // proxy to the protected abstract version
}
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow