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?

Foi útil?

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
scroll top