Laden...

Vererbung: bei Instanziierung einer Kindklasse alle Eigenschaften der übergebenen Basisklasse setzen

Erstellt von midibase102 vor 12 Jahren Letzter Beitrag vor 12 Jahren 4.720 Views
M
midibase102 Themenstarter:in
2 Beiträge seit 2011
vor 12 Jahren
Vererbung: bei Instanziierung einer Kindklasse alle Eigenschaften der übergebenen Basisklasse setzen

Hallo Leute, kann nicht recht glauben, dass es hierfür keine einfachere Möglichkeit gibt.
Folgendes Konstrukt ist gegeben:

class A { int Wert1, Object O1,..}
class B: A { }

//Ich habe nun ein gegebenes a
A a = new A();
a.Wert1=12;
a.O1=foo;
.....

//Nun möchte ich ein neues B erzeugen, dass in seiner Basisklasse (A) alle Werte von A enthält.
Derzeitige Lösung:
B b = new B();
b.Wert1=a.Wert1;
b.O1=a.O1;

//soetwas funkt. leider nicht :(
B b = new B(a);
/*wobei bei B ein eigener Konstruktor wäre
...
public B(A a) { base=a;} //funkt. leider nihct.
..*/

D.h. ich möchte ein vorhandenes A einfach um die Eigenschaften von B erweitern, ohne jedes einzelne Element händisch zuordnen zu müssen, weil auch u.a. die Gefahr dabei besteht, wenn eines Tages A erweitert wird, dass diese bei der B-Zuordnung vergessen wird nachzuvollziehen.
Kennt jemand eine Lösung? Oder habe ich einen Denkfehler?

Danke
midibase

W
113 Beiträge seit 2006
vor 12 Jahren

Hallo,

du musst in B einen extra Konstruktor definieren wo du A übergeben kannst.


class B : A
{
    public B(A a)
    {
        // hier die relevanten Eigenschaften von A übenehmen
    }
}

mfg,
XaN

D
500 Beiträge seit 2007
vor 12 Jahren

Hi!

Du kannst am besten in A einen entsprechenden Konstruktor bereitstellen, der ein existierendes A uebernimmt und die Werte setzt. Da derjenige, der A pflegt, programmiert, etc. am besten weiss, welche Werte zu setzen sind bzw. bei Aenderungen, wie dazukommende Properties, auch in A das Setzen der Werte direkt anpassen kann.

Natuerlich muss B dann entsprechenden Konstruktor abieten (siehe Vorpsoting) und A weiterreichen.


class B : A
 {
     public B(A a) : base(a)
     {
     }
 }

Gruss,
Moe

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo,

wenn ich das Problem richtig verstehe läuft das unter dem Begriff "Kopierkonstruktor".

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

M
midibase102 Themenstarter:in
2 Beiträge seit 2011
vor 12 Jahren

Hoppala, DaMoe80!
base(a) gibt/funkt. nihct.

habe es mal auf die schnelle nachgebaut und wird mit dem Fehler> Fehlermeldung:

Error 1 Use of keyword 'base' is not valid in this context quittiert!


 class Program {
        static void Main(string[] args) {
            A a = new A();
            a.Wert1 = 12;
            a.Wert2 = 24;
            a.Foo = "hallo";

            B b = new B(a);

        }
    }


    public class A {
        public int Wert1 { get; set; }
        public int Wert2 { get; set; }
        public object Foo { get; set; }
    }

    public class B:A {
        public B() {
            
        }
        public B(A a) {
            base(a);
        }
        
    }

Bei der Variante von WarLorD_XaN muss ich ja auch jede Eigenschaft von A in die "Hand" nehmen und explizit zuweisen!

Danke gfoidl,

ja ich fürchte dein Hinweis "Kopierkonstruktor" (hab ich noch nie gehört) trifft es, und da es in C# scheinbar dazu keine Möglichkeit, ausser der händischen Zuordnung gibt
werde wohl damit leben müssen 😦

Auf der anderen Seite müsste ja ev. mit Reflection etwas machbar sein, oder nicht?

Danke nochmal

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo midibase102,

Hoppala, DaMoe80!
base(a) gibt/funkt. nihct.

Deshalb hat er auch geschrieben:

Du kannst am besten in A einen entsprechenden Konstruktor bereitstellen,

und dann gibts das schon. Wenn du es nachbaust schau dir an wie es DaMoe80 gemacht hat.

Mittels Reflection kannst du auf die Eigenschaften/Felder auch zugreifen. Suche sonst im Forum auch nach DeepCopy/Clone/etc. um Lösungen in diese Richtung zu finden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo zusammen,

ich würde schon den Wunsch, ein Objekt vom Typ B auf Basis eines Objekts vom Typ der Oberklasse A zu erzeugen, als solches infrage stellen. Mit klingt das so, würde da eigentlich der Wunsch dahinter stehen, den Typ eines Objekts zur Laufzeit zu ändern. Also dass man zuerst ein Objekt vom Typ Vogel erstellt und dann irgendwann merkt, dass es eigentliche eine Taube ist und nun will man aus dem Vogel eine Taube machen. Da man den Typ eines einmal erstellen Objekts zur Laufzeit (absichtlich) nicht ändern kann, versucht man halt das nächst beste, nämlich ein neues (konkreteres) Objekt auf Basis des alten zu erzeugen.

Das ist nicht sinnvoll.

Schon Kopierkonstruktoren (also in dem Fall, wo altes und neues Objekt vom gleichen Typ sind) sind mit großer Vorsicht zu behandeln. Sie machen nur bei Werttypen Sinn (oder bei den wenigen Referenztypen, deren Wert gegenüber deren Identität klar im Vordergrund steht, z.B. Listen und andere Collections).

Weitere Informationen zu der Kopierproblematik gibt es in Kopie ohne ICloneable [oder warum man Objekte nicht kopieren sollte; Transaktionen auf Objekten].

Man sollte nie versuchen, den Typ eines Objekts nachträglich zu ändern - auch nicht auf Umwegen.

herbivore