Rückgabe Typ bei Implementierung von IClonable
-
Hallo,
ich habe in einer Klasse IClonabe implementiert und die Methode Clone() umgesetzt.
Soweit ich die Dokumentation verstanden habe, muss Clone() immer den Typ Object zurückgeben.
Class Foo : IClonabel { Foo(){} Object Clone() { return gcnew Foo(this); } }
Beim Clonen muss ich also immer Casten:
Foo Class1 = gcnew Foo(); Foo Class2 = (Foo)Class1.Clone();
Ist es richtig, dass man bei Clone nur von Typ Object zurückgeben kann? Irgendwie erscheint mir dass nicht .Net like
Beste Grüße
Solick
-
Hallo,
Es ist immer nen Object. Warum ist ganz leicht erklärt. Es stammt schon aus .Net Urzeiten wo es noch gar keine Generics gab im Framework, daher konnte man auch nicht bestimmte Typen beim Clone zurückgeben, sondern es musste Object sein. Aber selbst mit Generics wäre das momentan nicht lösbar.
-
Ich würde Dir empfehlen einen "Copy-Construktor" anzulegen; dieser kannst Du dann sowohl in IConable-Clone verwenden (und ein Object zurückgeben), als auch direkt, was dann ohne casten auskommt.
-
Genau so habe ich es gelöst, dachte nur, das Iclonable dass noch irgendwie anders löst. Aber dann werd ich es so verwenden und einfach direkt den Kopierkonstruktor ansprechen.
Was mich nur wundert, warum sollte ich dann überhaupt noch IClonable implementieren, der Copy-Konstruktor reicht doch dann aus oder?
Grüße Solick
-
IClonable macht dann Sinn, wenn der Client-Code ein Objekt klonen muss, von dem er den genauen Typ nicht kennt.
Animal^ a = gcnew Sheep(); Animal^ b = (Animal) (a->Clone());
Um hier einen Copy-Ctor verwenden zu können, müsstest du in der 2. Zeile wissen, dass es sich um ein Sheep und nicht "nur" um ein Animal handelt. Vielleicht hat nämlich Animal auch garkeinen Copy-Ctor.
-
Ja genau... trotzdem würde ich immer einen Copy-Ctor machen, damit der "simple" Fall ohne casten abgedeckt werden kann... und man das ganze nur einmal implementiert und in Clone wiederverwenden kann...
-
Dann hab ichs ja richtig gemacht
Danke an alle und schönen Tag noch
Grüße Solick