| 

.NET C# Java Javascript Exception

2
Ich habe eine Klasse A:
public class A 
{
public string PropA { get; set; }
}


und ein geerbte Klasse Aplus, die von A erbt:
public class Aplus : A 
{
public string PropAplus { get; set; }
}


später habe ich ein Objekt der Klasse A:
A objA = new A() { PropA = "irgendwas" };


nun mein Problem (wohl eher meine gedankliche Blockade): wie bekomme ich objA zu einem objAplus?

Aplus objAplus = objA as Aplus;


bringt zur Laufzeit:
objAPlus = null;


Klar, ich könnte einen Constructor in Aplus definieren, mit einem Parameter vom Typ A und weise explizit das Property zu, aber bei vielen Properties wird das mühsehlig, und wenn in Klasse A weitere Properties hinzugekommen oder welche entfernt werden, muss das nachgezogen werden.
Dabei enthält doch Klasse A nichts, was es in Klasse Aplus nicht auch gibt.

Nun programmiere ich mein halbes Leben schon objektorientiert, komme mir hier also mit dieser Frage recht dämlich vor, aber C# ist für mich eben noch neu.

Danke sehr für eure Hilfe. Ein Link, ein Stichwort, Suchbegriffe für Google bringen mich bestimmt auch weiter.
News:
01.04.2011
Baumgärtel 21 1 2
Floyd 14,6k 3 9
Edit: Tags bearbeitet
Floyd 01.04.2011
5 Antworten
2
Hallo,

Also mir ist nicht bekannt, wie man mit deinen Bedingungen ein Parent Objekt in ein Child Objekt casten kann. Was du machen kannst, ist dass du dem Objekt schon beim initialisieren sagst, um welchen Typ es sich handelt.

A objA = new Aplus() { PropA = "irgendwas" };


Somit ist es die möglich die Objekte bereits im Vorfeld zu deklarieren, aber erst später mit den richtigen Typen zu initialisieren.

Beispiel:

public class A 
{
public string PropA { get; set; }
}

public class Aplus : A
{
public string PropA { get; set; }
}

public class Aplus2 : A
{
public string PropA { get; set; }
}

public partial class MainForm : Form
{
A _obj1;
A _obj2;

public void SomeInteraction()
{
_obj1 = new Aplus() { propA = "Some Value" };
_obj2 = new Aplus2() { propA = "Some Value" };
}
}


Hiermit hast du jetzt 2 Objekte der Parent Klasse A, die zu einem späteren Zeitpunkt erst deklariert werden.

Ich hoffe, das hilft dir weiter. Wenn nicht, meld dich nochmal.

Gruß Andy
01.04.2011
cruX 803 1 1 9
cruX 803 1 1 9
Ich wollte ein DO, das ich über eine ServiceSchnittstelle erhalten, bequem um weitere Properties erweitern. Aber ich bekomme das Objekt ersteinmal als objA ...

Danke für dein Angebot
Baumgärtel 01.04.2011
1
später habe ich ein Objekt der Klasse A:
A objA = new A() { PropA = "irgendwas" };

nun mein Problem (wohl eher meine gedankliche Blockade): wie bekomme ich objA zu einem objAplus?

Aplus objAplus = objA as Aplus;

bringt zur Laufzeit:
objAPlus = null;

du bekommst null zurück weil objA eine Instanz von der Basis-Klasse A ist und nicht von Aplus deswegen kannst du es nicht in ein Aplus-Objekt casten. du musst schon ein Aplus-Objekt instanziieren damit es sich in A und dan A in Aplus casten lässt:
A objA = new A();
Aplus objAplus = objA as Aplus; // = null

Aplus objAplus = new Aplus();
A objA = objAplus as A; // = A
Aplus objAplus2 = objA as Aplus // = Aplus


und ich denke dein Fehler ist, dass du statt des Properties das eigentliche Objekt castest, ich vermute du wolltest das machen:

A objA = new A() { PropAplus = "irgendwas" };
Aplus objAplus = objA.PropAplus as Aplus; // funktioniert = Aplus

obwohl hier ist kein Casten nötig
01.04.2011
pinchbeck 373 1 8
Stimmt, hätte hilfreich sein können, wenn ich geschrieben hätte, was ich will ... :-)

Ich bekomme über eine Serviceschnittstelle ein DatenObjekt. Dieses möchte ich um eigene Properties erweitern, ggf. sogar 'ne kleine Methode dazu, und dann als ObservableCollection in einem Grid anzeigen lassen.
Wollte mir Arbeit bei der Anlage und bei Änderungen ersparen, bin halt doch nur ein typischer Entwickler ;-)

Aber eigentlich war mein Problem, dass ich nicht wußte, in welcher Richtung ich casten kann ... aber es schon jetzt logisch.

Danke allen
Baumgärtel 01.04.2011
0
So rum funktioniert das Casten nicht, Wenn du ein Parent instanziierst kann man das nicht in ein Child casten. Umgekehrt natürlich schon.

Ich würde Deiner Frage nach vermuten Dir wäre mit einer Fabrikmethode, evtl. einem Converter geholfen?
01.04.2011
wurzelchen 289 5
0
Getestet, und Funktioniert:

using System.Reflection;

public class A
{
public string PropA { get; set; }
}

public class Aplus : A
{
public Aplus(A a){
Type typeA = a.GetType();
while (typeA != null)
{
FieldInfo[] myObjectFields = typeA.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance );
foreach (FieldInfo fi in myObjectFields)
{
fi.SetValue(this, fi.GetValue(a));
}
typeA = typeA.BaseType;

}
}
public string PropAplus { get; set; }
}

public class MyClass
{
public static void RunSnippet()
{
A objA = new A() { PropA = "irgendwas" };
Aplus objAplus = new Aplus(objA);
Console.WriteLine(objAplus.PropA);
}
}
01.04.2011
Floyd 14,6k 3 9
Floyd 14,6k 3 9
0
Sie dir mal die beiden Schlüsselworte implicit und explicit an. Diese erlauben dir eine Konvertierung anzugeben wodurch die Zuweisung von Elterntypen auf ihre Kinder möglich wird. Oder anders gesagt: Du kannst dir damit einen Überladung des Zuweisungsoperators schreiben.

Bendenke aber, dass du vorallem beim implicit vorsichtig sein musst. Es versteckt den eigentlichen Cast dahinter und macht das Debuggen schwieriger. Ich würde dir an der Stelle also zu explicit und einer sauberen Dokumentation raten, wobei man die ja immer anlegen sollte...
04.04.2011
Hendrik Lösch 1,5k 1 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH