Format71 Skrevet 1. mars 2004 Del Skrevet 1. mars 2004 Tenk deg følgende: type TItem = class(TObject); TSpesificItem = class(TItem); TItemClass = class of TItem; TSpesificItemClass = class of TSpesificItem; TItem har en metode som tar en TItemClass som parameter. I en liste har jeg en haug med TSpesificItemClass-arvinger. Disse ønsker jeg å kunne putte inn i TItem sin metode, men da får jeg beskjed om at TSpesificItemClass ikke er kompatibel med TItemClass. Hvorfor ikke? TSpesificItemClass er jo 'arvet' fra TItemClass. -Vegar Lenke til kommentar
kilogram Skrevet 1. mars 2004 Del Skrevet 1. mars 2004 Hvorfor ikke? TSpesificItemClass er jo 'arvet' fra TItemClass. Nei, TItemClass er "bror" til TSpecificItem. TSpecificItemClass er då ikkje direkte i slekt med TItemClass, men med TItem. Hold tunga rett i munnen når du ser over det, så skjønner du kva eg meiner... Lenke til kommentar
Format71 Skrevet 2. mars 2004 Forfatter Del Skrevet 2. mars 2004 Nei, jeg forstår ikke hva du mener. Du må huske på at i TItemClass har du tilgjengelig klassemetodene for TItem og TObject. I TSpesificItemClass har du tilgjengelig alle klassemetoder for både TItemClass, TItem og TObject. Således skulle TSpesificItemClass vært en fullverdig TItemClass. Eneste måten å se dem som søsken er å la TItemClass = class(TClass) og TSpesificItemClass = class(TClass), men det er nå ikke engang slik syntaksen er... -Vegar Lenke til kommentar
kilogram Skrevet 3. mars 2004 Del Skrevet 3. mars 2004 Eg var visst litt for rask, og las feil i koden din. Eg kan heller ikkje forstå kvifor dette ikkje skal virke. Beklagar. Lenke til kommentar
DidzisK Skrevet 8. mars 2004 Del Skrevet 8. mars 2004 (endret) Jeg er ikke sikker at jeg skjønner hva du mener. Dette fungerer hos meg: type TItem = class; TSpesificItem = class; TItemClass = class of TItem; TSpesificItemClass = class of TSpesificItem; TItem = class(TObject) public procedure MinMetode(AClass:TItemClass); end; TSpesificItem = class(TItem); TSpesItemChild=class(TSpesificItem); var Form1: TForm1; implementation {$R *.dfm} procedure TItem.MinMetode(AClass: TItemClass); begin //legg inn kode her end; procedure TForm1.Button1Click(Sender: TObject); var LocItem:TSpesificItem; //her kan jeg også ha TItem begin LocItem:=TSpesificItem.Create;{her kan jeg også ha TItem, blir kompilert uten feil} try LocItem.MinMetode(TSpesItemChild); finally LocItem.Free; end; end; Eller var du alvorlig om dette: TSpesificItemClass-arvinger.?Dvs. TArving=class(TSpesificItemClass) og LocItem.MinMetode(TArving); Det mente du vel ikke - da får jeg feil "class type required" - fordi type TSpesificItemClass er selvfølgelig ikke noe klasse. Endret 8. mars 2004 av DidzisK Lenke til kommentar
Format71 Skrevet 8. mars 2004 Forfatter Del Skrevet 8. mars 2004 'en haug med TSpesificItemClass-arvinger' => en liste med referanse til klasser, ikke instanser. Dvs. en liste med TSpesificItemChild1, TSpesificItemChild2 osv osv. dvs. TArving = class(TSpesificItem) og locitem.MinMetode(TArving). I mitt tilfelle får jeg beskjed om at TSpesificItemClass ikke kan puttes inn hvor TItemClass er forventet. Har ærlig talt ikke forsøkt å lage noe lite enkelt eksempel ala det du viser til her. Problemet mitt eksisterer i en mye større sammenheng. Er mulig det er noe jeg har oversett. -Vegar Lenke til kommentar
DidzisK Skrevet 10. mars 2004 Del Skrevet 10. mars 2004 Det skal funke, så vidt jeg skjønner. En ting ang. koden min: som du ser, er type TSpesItemChild unødvendig der. Metode er bygd rundt TItemClass. Kanskje kompiler vet ikke noe om arving-klassene som ligger i lista - kun at de er produsert ved hjelp av TSpesItemChild. Og da er det klart at den kan ikke detektere "kompatibilitet" av TSpesItemChild-klasse og TItemClass-klasse, selv om vi vet at TSpesItemChild er "subset" av TItemClass. Bare spekulasjon, ikke at jeg tror så mye på denne forklaringen. Eller... Hvis du har definert en variable med type TSpesItemChild, men bruker den hvor TItemClass er forventet. Tester... Nei, desverre funker dette også hos meg. Jeg modifiserte Button1Click slik: procedure TForm1.Button1Click(Sender: TObject); var LocItem:TSpesificItem; Klasse:TSpesificItemClass; begin LocItem:=TSpesificItem.Create; try Klasse:=TSpesItemChild; {her kaller vi procedure TItem.MinMetode(AClass: TItemClass); med TSpesificItemClass som argument} LocItem.MinMetode(Klasse); finally LocItem.Free; end; end; Og fikk kompilert og kjørt den. Du må nesten poste den virkelige koden her... Lenke til kommentar
Format71 Skrevet 10. mars 2004 Forfatter Del Skrevet 10. mars 2004 (endret) Den virkelige koden eksisterer ikke lenger. Løste det på en annen måte for å komme videre. Men begynner å lure på om det må ha vært noe anna kødd i koden som gjorde at jeg ikke kom videre. Tok en veldig kjapp test på noe som lignet det jeg hadde før, og da kompilerte det. Konklusjon: Problemet var at jeg ikke forsto hvorfor det var slik det var. Når det etter vært viser seg og muligens ikke være slik jeg ikke kunne forstå at det skulle være, så er det ikke noe å ikke forstå så da er vi alle fornøyd ;-) -Vegar (Se hvem som har fylt sine første 8 bit med innlegg... ) Endret 10. mars 2004 av Format71 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå