Gå til innhold

Anbefalte innlegg

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
Videoannonse
Annonse
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

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

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 av DidzisK
Lenke til kommentar

'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

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

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... :thumbs: )

Endret av Format71
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...