Wie spezifiziere ich Typbeschränkung und Vererbung bei der Deklaration von Klassen?
-
12-12-2019 - |
Frage
Ich habe eine abstract
klasse, die eine Typbeschränkung hat.Aber ich möchte auch das machen abstract
klasse implementiert eine Schnittstelle.
Z.B:
public abstract class PostEvent<TPost> : IDomainEvent, where TPost : Post, new()
Was nicht kompiliert wird.
Ich will das nicht:
public abstract class PostEvent<TPost> where TPost : Post, IDomainEvent, new()
Denn das bedeutet TPost : IDomainEvent
Ich will PostEvent : IDomainEvent
Was ist die Syntax?
Lösung
Versuchen Sie dies:
public abstract class PostEvent<TPost> : IDomainEvent where TPost : Post, new()
Sie möchten kein Komma zwischen der Schnittstellenliste und den generischen Einschränkungen.
Andere Tipps
Sie müssen es tatsächlich implementieren (Sie können die Implementierung nicht verlassen rein zu den konkreten Typen - es muss wissen, wo ich anfangen soll):
public abstract class PostEvent<TPost> : IDomainEvent
where TPost : Post, new()
{
public abstract void SomeInterfaceMethod();
}
Sie können auch eine explizite Schnittstellenimplementierung und eine geschützte abstrakte Methode verwenden, wenn Sie Otis nicht für die öffentliche API verwenden möchten:
public abstract class PostEvent<TPost> : IDomainEvent
where TPost : Post, new()
{
protected abstract void SomeInterfaceMethod();
void IDomainEvent.SomeInterfaceMethod() {
SomeInterfaceMethod(); // proxy to the protected abstract version
}
}