webForumDet fria alternativet

[.NET 2.0] Arv

.NETur .NET

7 svar · 461 visningar · startad av aleborg

aleborgMedlem sedan jan. 20013 341 inlägg
#1

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
#2

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
#3

Misstänkte att jag skulle behöva göra så :(

CompusaMedlem sedan jan. 20023 327 inlägg
#4

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
#5

Hur menar du förresten med "Anropa A-konstruktorn (base i C#)"

CompusaMedlem sedan jan. 20023 327 inlägg
#6

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.

CompusaMedlem sedan jan. 20023 327 inlägg
#7

Fick du ordning på det?

aleborgMedlem sedan jan. 20013 341 inlägg
#8

Japp det fick jag, tack :)

129 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)