Erstellen eines geklonten Kopie Unterklasse von baseclass

Betrachten Sie dieses Szenario:

public class Base
{
    public int i;
}

public class Sub : Base
{
    public void foo() { /* do stuff */}
}

Und dann möchte ich, gegeben eine Instanz von Base bekommen eine geklonte Instanz der Sub (mit i=17 in diesem Fall) so, dass ich anrufen kann foo in der Unterklasse.

Base b = new Base { i=17 };
Sub s = CloneAndUpcast(b);
s.foo();

Jedoch, wie kann ich CloneAndUpcast?

Ich denke, das sollte möglich sein, die rekursiv Klonen alle Base-Mitglieder und-Eigenschaften mit der spiegelung. Aber einiges an Arbeit.

Jemand mit besser, ordentlicher Ideen?

PS. Das Szenario, wo ich denke über die Verwendung von dies ist ein Satz von "einfachen" Klassen, die in einer baumartigen Struktur (keine zyklische Graphen oder ähnliches hier) und alle Klassen sind einfache value-Inhaber. Der plan ist, eine blöde Schicht, die alle Werte und dann eine ähnliche Menge von Klassen (die Unterklassen), die tatsächlich enthält die business-Logik der Wert-Inhaber sollte nicht bewusst sein. In der Regel schlechte Praxis, ja. Ich denke, es funktioniert in diesem Fall.

  • Sie kann nicht genau das tun, was Ihr bittet. Es gibt eine Menge Gründe, warum, aber es genügt zu sagen, selbst wenn man das könnte, es ist generell eine schlechte Praxis. Wenn Sie können, geben Sie uns das breitere problem, das Sie lösen möchten, können wir Ihnen helfen das richtige Muster.
  • Das klingt wie eine Frage weist auf ein Allgemeines problem ist gelöst der falsche Weg. Weder der Schuh noch die Flasche aus Glas angebracht ist. Siehe: weblogs.asp.net/alex_papadimoulis/archive/2005/05/25/...
  • Ich denke, die Dinge, die Sie versuchen, zu erreichen, könnte darauf hindeuten, ein design-Problem. Auch, da i ist privat zu base Klasse, die sub kann es nicht verwenden, sowieso, also je nach Arbeitsweise Base es gibt keine Notwendigkeit zu kopieren, das Feld.
  • i war gedacht als Beispiel für die public-member. Sorry da.
InformationsquelleAutor leiflundgren | 2012-01-25
Schreibe einen Kommentar