Avatar billede alaflam Nybegynder
07. oktober 2005 - 12:57 Der er 14 kommentarer og
2 løsninger

typecasting af object

hejsa,

jeg fik en en beskrivelse af typecasting, men det ser ikke ud til at virke som jeg har forstået af arne_v.

    class class1
    {
        public void okay()
        {
            System.Console.Write("okay");
           
        }
    }

    class class2 : class1
    {
        public void test()
        {
            System.Console.Write("test");
        }
    }
   
    class Class3
    {
        static void Main(string[] args)
        {
            System.Console.Write("main");
            class1 c = new class2();
            c.okay();
        }
        }
    }

hvorfo kan c ikke få adgang til test funktionen i class2?
Avatar billede arne_v Ekspert
07. oktober 2005 - 13:00 #1
med en Using System og en } for meget fjernet så kører koden hos mig
Avatar billede alaflam Nybegynder
07. oktober 2005 - 13:01 #2
jeg har bare skrevet den hurtig som eks.

problemet er c objectet kan ikke få adgang til test.
Avatar billede bennytordrup Nybegynder
07. oktober 2005 - 13:02 #3
(c as class2).test();
Avatar billede bennytordrup Nybegynder
07. oktober 2005 - 13:03 #4
Du erklærer c som class1, og derved kan du ikke se nye tilføjelser i nedarvninger. Derfor er du nødt til at typecaste den - i mit eksempel med as.

Du kan også typecaste således:

((class2)c).test();

Hvordan du vælger, er en smagssag.
Avatar billede alaflam Nybegynder
07. oktober 2005 - 13:04 #5
bennytordrup, du bruger en anden metode :)

jeg prøver på at forstå type casting :) hvilken give mig lidt hovedpine ligenu...

jeg tror jeg har misforstået arne da han beskrev det til mig
Avatar billede arne_v Ekspert
07. oktober 2005 - 13:05 #6
åh - det var test du ville bruge

så skal du enten caste some Benny beskriver eller bedre redesigne så du ikke
har behov for det, fordi hvis du har brug for en class2 så skal du ikke have en class2
Avatar billede arne_v Ekspert
07. oktober 2005 - 13:06 #7
så skal du ikke have en class1
Avatar billede bennytordrup Nybegynder
07. oktober 2005 - 13:10 #8
alaflam > jeg bruger typecasting, da typecasting er at ændre et instans til en anden type.

Det, du har fat i i din kode, er nedarvning, og det er noget helt andet.

Min metode med at typecaste class1 til class2 er fuldt lovlig, da class2 er nedarvet fra class1, og variablen er instantieret som en class2.
Avatar billede alaflam Nybegynder
07. oktober 2005 - 13:15 #9
HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create("http://www.amazon.com");

så er vi tilbage til den her linie... ?

jeg er forvirret nu!
Avatar billede alaflam Nybegynder
07. oktober 2005 - 13:16 #10
class2 c = new class2();
class1 a = (class1)c.test();

hvad vil der sker så her ?

hvad er det a får fra c på den måde ?
Avatar billede bennytordrup Nybegynder
07. oktober 2005 - 13:23 #11
Det vil fejle. a får et objekt af typen class1, der ikke indeholder metoden test().

class1 c = new class2()

vil give en instanc i c, der umiddelbart er en class1, men i praksis er en class2. Det kan lade sig gøre, da class2 nedarver fra class1.

For at få fat i specifikke class2 metoder, er du nødt til at typecaste:

((class2)c).test();

eller

(c as class2).test();
Avatar billede arne_v Ekspert
07. oktober 2005 - 13:24 #12
WebRequest Create er erklæret til at returnere en WebRequest

for en HTTP URL returnere den en HttpWebRequest

da HttpWebRequest er en sub klasse til WebRequest er det OK

WebRequest wr = WebRequest.Create(url);

og du kan bruge alle metoderne i WebRequest

hvis  du

HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(url);

så kan du bruge alle metoderne i HttpWebRequest (inkl. fra super kalssen WebRequest)

[og hvis det ikke er en HTTP URL så får du en ClassCastException]
Avatar billede alaflam Nybegynder
07. oktober 2005 - 13:35 #13
bennytordrup, jeg fortækker mere (c as class2.test()); hvilket er mere forstående end den først :), men når du siger at a vil fejl fordi den ikke indeholder metoden test(), så får du det til at lyde som den vil virke hvis a indeholder metoden test(), hvilket selvfølgelig ikke gøre :)

arne_v, kan du måske give mig en lille kort kode der virker på samme måde som httpwebrequest ??

hvor jeg kan skrive

class1 a = (class1)b.test();
Avatar billede arne_v Ekspert
07. oktober 2005 - 13:39 #14
er det ikke det som din kode med bennys kald gør ?
Avatar billede alaflam Nybegynder
07. oktober 2005 - 13:44 #15
jeg siger mange tak til begge tak, nu vil jeg ikke bruge mere af jeres tid :-)

kan du lægge et svar arne :P
Avatar billede arne_v Ekspert
07. oktober 2005 - 13:55 #16
.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester