Ich versuche, ICloneable.Clone()
in einer abstrakten Basisklasse zu implementieren, so dass Unterklassen sich nicht darum kümmern müssen. Eine grundlegende Verantwortung dieser Klasse besteht darin, eine interne Guid
-Eigenschaft zu haben, die an die Klone weitergegeben werden sollte - das heißt, es ist eher ein "Eigenschaftsklon". Dadurch kann ich ein aus einem Repository entnommenes Objekt klonen, seine Eigenschaften ändern, ohne das ursprüngliche Element zu ändern, und anschließend die geänderte Instanz so an den Repo zurücksenden, dass sie anhand der ID erkannt werden kann.Benutzerdefinierte ICloneable-Implementierung in abstrakte Basisklasse einfügen
Aber meine aktuelle Implementierung steht vor einem Problem: Ich kann die Instanzen nicht erstellen, um die ID weiterzugeben, weil die Klasse abstrakt ist!
public abstract class RepoItem : ICloneable, IEquatable<RepoItem>
{
protected RepoItem()
{
Id = Guid.NewGuid();
}
private RepoItem(Guid id)
{
Id = id;
}
public Guid Id { get; private set; }
public object Clone()
{
return new RepoItem(Id); // cannot create instance of abstract class
}
public bool Equals(RepoItem other)
{
return other.Id == Id;
}
}
Gibt es eine Möglichkeit, dieses Problem zu lösen? Ist das ein anständiges Design für den Anfang?
Sie erstellen sowieso den falschen Typ. Und das Problem ist, Sie haben keine Ahnung, was der richtige Typ in der Basisklasse sein sollte. Sie müssen eine Instanz des tatsächlichen Laufzeittyps erstellen - z. durch eine abstrakte Methode, die die abgeleiteten Klassen implementieren werden. – Luaan
Sie können auch einfach 'Clone' abstrahieren, weil die Kind-Klasse diejenigen sind, die sich klonen können. – juharr
@Luaan Glaubst du, dass ein auf Reflexion basierender Ansatz ausreichen würde? – heltonbiker