Ich versuche, eine generische Schnittstelle zu erstellen, die die System.ICloneable-Schnittstelle erbt, aber der Rückgabewert der Clone() - Methode ist T. Natürlich benötigt der T-Typ Einschränkungen um sicher zu gehen, dass es eine Vererbung der System.Object-Klasse ist, aber der folgende Code nicht funktioniert.Geben Sie Parametereinschränkungen für das Liskov-Prinzip in C# ein. .NET
public interface ICloneable<T> : System.ICloneable where T : object {
T Clone();
}
Was mache ich falsch?
Auch die folgenden Einschränkungen funktionieren nicht:
- where T: System.Object
- where T: Klasse
wie kann ich das Liskov-Prinzip in diesem Fall verwenden, die sagt, dass Sie Ihren Rückgabetyp einschränken können, um dieses Problem zu lösen?
P.S .: Sorry für mein Englisch, wenn ich Fehler gemacht habe. Ich bin kein englischer Muttersprachler.
Keine Entschuldigung für Ihr Englisch, es ist in Ordnung. –
Übrigens würde ich vorschlagen, dass Sie den Typ T als Kovariante markieren (setzen Sie das Wort "out" davor) und fügen Sie entweder eine schreibgeschützte Eigenschaft "T self" hinzu, oder definieren Sie eine Schnittstelle ISelf mit einem schreibgeschützten Eigenschaft "T selbst". Beachten Sie, dass T nicht auf ICloneable oder ISelf beschränkt sein sollte. Wenn Sie dies tun, können Sie die Klassen Foo und DerivedFoo ohne öffentliche Klonmethode und die Klassen CloneableFoo und CloneableDerivedFoo verwenden, die von diesen abgeleitet sind und jedes klonbare Derivat von Foo als ICloneable akzeptieren, obwohl solche klonbaren Derivate keine gemeinsame Basisklasse teilen . –
supercat