Results 1 to 7 of 7

Thread: overerving werkt niet

  1. #1

    overerving werkt niet

    Hallo,

    Ik heb de volgende structuur

    TverkoopOrder = class(TObject)

    TVerkoopOrderRep = class(TVerkoopOrder)

    In mijn hoofd programma maak ik een VerkoopOrder aan van het type TverkoopOrder
    Code:
    verkooporder := Tverkooporder.create;
    Wanneer ik een explicite typecast doe naar het type TVerkoopOrderRep verwacht ik dat ik naar de functie spring van de Rep class en niet naar de base class
    Code:
    TVerkoopOrderRep(VerkoopOrder).Write;
    Maar als ik dit uitvoer kom ik gewoon in de write functie van de base class (TVerkoopOrder) uit
    Wat doe ik verkeerd

    De Write functie in TverkoopOrderRep is override en in de base class is deze virtual gemaakt

  2. #2
    Ja, maar je maakt met verkooporder := Tverkooporder.create; ook een echt TVerkooporder aan en geen TVerkoopOrderRep.
    Dus je kunt met een instantie van TVerkoopOrder nooit de Write krijgen van TVerkoopOrderRep.

    Doe dan verkooporder := TverkooporderRep.create;

  3. #3
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Tis wel vreemd. Voor een niet virtuele method verwacht je wel in tverkooporderrep.write uit te komen (en dan jammerlijk te crashen zo gauw je iets wat tverkooporderrep specifiek is aan raakt).

  4. #4
    Heb nu een werkende situatie waarbij ik er idd expliciet een TverkoopOrderRep van maak.
    Is wat lastiger mar waarschijnlijk wel een betere oplossing

  5. #5
    Als je het goed doet, is dat zelfs makkelijker. Je kan in TVerkoopOrder de write al declareren als virtual, en in TVerkoopOrderRep kan je 'm overriden. De instance die je maakt wordt een TVerkoopOrderRep, maar de variabele mag best van TVerkoopOrder zijn. Ik heb de indruk dat je het in eerste instantie precies verkeerdom hebt gedaan.

    Delphi Code:
    1. TverkoopOrder = class(TObject)
    2.   procedure Write; virtual; abstract;
    3. end;
    4.  
    5. TVerkoopOrderRep = class(TVerkoopOrder)
    6.   procedure Write; override;
    7. end;
    8.  
    9. var
    10.   vo: TVerkoopOrder;
    11. begin
    12.   vo := TVerkoopOrderRep.Create;
    13.  
    14.   vo.Write; // De override wordt aangeroepen ondanks dat vo van het base type is.
    15. end;
    1+1=b

  6. #6
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Maar dan ben je verplicht een procedure write aan te maken, omdat in de hoofdklasse deze abstract wordt weergegeven. Dan kan je net zo goed een interface gebruiken.
    Delphi is great. Lazarus is more powerfull

  7. #7
    Ja, dan kan je inderdaad ook een interface gebruiken. En dat kan ik ook aanraden in veel gevallen

    Maar de vraag ging over overerven dus ik wou er niet nog een onderwerp bij halen, en kon er bovendien veilig van uit gaan dat er inderdaad een method in de base class is. Of die abstract is of niet hangt er natuurlijk maar net van af.
    1+1=b

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •