aleborgMedlem sedan jan. 20013 341 inlägg Jag har tidigare inte varit i större behov av att använda mig av arv i mina klasser, men nu så är jag i stort behov av det men det funkar inte som jag vill :(
Jag har classA och classB, den sistnämnda ärver den första och har några extra properties.
I min kod har jag en färdigfylld instans av classA som jag nu behöver konvertera till en classB.
classA a = mySerializer.Deserialize(aCollXML) as classA;
classB b = a as classB;
men det funkar ju inte riktigt, hur löser man detta egentligen?
CompusaMedlem sedan jan. 20023 327 inlägg B är en A, men A är inte en B så det är inte så konstigt att det inte fungerar. Det du skulle kunna göra är en copy-constructor i klass B som tar emot ett objekt av typen A och sedan skapar ett B objekt av detta. Nu kan Java bäst och lite C# men du kanske förstår principen ändå?
public class B {
public B(A object) {
// Anropa A-konstruktorn (base i C#)
// B-properties får du sätta till något default värde
}
}
B bObject = new B(aObject);
aleborgMedlem sedan jan. 20013 341 inlägg Misstänkte att jag skulle behöva göra så :(
CompusaMedlem sedan jan. 20023 327 inlägg Fast det är inte dåligt att ha en copy-constructor, det bör man ha i sina klasser om behovet finns. Det du vill göra är en så kallad "downcasting" och jag antar att din kod kompilerar men du får ett runtime-error? Detta beror på att när du gör en downcasting så misslyckas det under runtime på grund av att A görs till en B men A har inte några utav egenskaperna som en B har. Använder du en copy-constructor kan du se till att dessa properties i alla fall initieras. Downcasting är riskabelt och något man bör undvika om det inte är vettigt.
aleborgMedlem sedan jan. 20013 341 inlägg Hur menar du förresten med "Anropa A-konstruktorn (base i C#)"
CompusaMedlem sedan jan. 20023 327 inlägg Att du gör ett anrop till konstruktorn i den klassen som B ärver av (dvs A), vet ej hur det ser ut i VB.net. Men så här skulle det kunna se ut i C#
public class A {
private string property1;
private string property2;
public A(property1, propery2) {
this.property1 = property2;
this.property2 = property2;
}
}
public class B {
int propery3;
public B(A object) {
base(object.property1, object.property2); // Anropar parameterserad konstruktor i A
// B-properties får du sätta till något default-värde, eftersom A ej har sådana
property3 = 0;
}
}
B bObject = new B(aObject);
Frågan jag ställer mig är varför du behöver göra om en A till en B? Om det är möjligt så skulle jag försöka göra en ABC (Abstract Base Class), som du sedan låter dina andra klasser ärva i från.
aleborgMedlem sedan jan. 20013 341 inlägg Japp det fick jag, tack :)