Results 1 to 3 of 3

Thread: Vraag over classes en inheritence

  1. #1

    Vraag over classes en inheritence

    Ik heb een aantal classes, en dit zijn basis classen waar de ander gebruikte classes van inheritten. Nu heb ik op die basis class een
    Code:
    LoadFromStream
    gemaakt, en via een constructor
    Code:
    CreateFromStream
    waar ik deze functie in uitvoer kan ik in een component die een filestream opent deze objecten terug inlezen. Nu omdat dit een basis class is override ik deze constructor in de subclassen. Mijn vraag is nu als ik de functie override, om deze uit te breiden om ook andere velden uit de stream te lezen - wordt deze overridden functie dan aangeroepen vanuit de voorgaande constructor? En als ik dus in de overridden constructor dit doe:
    Delphi Code:
    1. constructor myinheritclass.CreateFromStream(AStream: TStream);
    2. begin
    3.   inherited;
    4.   LoadFromStream(AStream);
    5. end;
    wordt die LoadFromStream dan 2x aangeroepen? Dus eerste maal vanuit de bestaande constructor in de parent class, en vervolgens nog eens in de overridden constructor of moet ik zoals ik hierboven doe deze LoadFromStream ook uitvoeren?

    Het geheel zit in een nogal grote unit met allerlei classes, als het makkelijker is wil ik wel een stukje eruit halen om het wat te verduidelijken..

  2. #2
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,095
    Ja. LoadFromStream wordt dan twee keer aangeroepen.

    Met inherited wordt de gehele routine in de klasse waarvan je afstamt uitgevoerd. Inherited zou je in gedachten kunnen vervangen door TMyBovenliggendeKlasse.CreateFromStream(AStream); Maar er is een andere manier waarop dit ook duidelijk blijkt, als volgt:
    Delphi Code:
    1. constructor myinheritclass.CreateFromStream(AStream: TStream);
    2. begin
    3.   inherited CreateFromStream(AStream);
    4.   LoadFromStream(AStream);
    5. end;
    Het is mijn persoonlijke advies om altijd de naam van de routine achter inherited te zetten. Niet alleen omdat dit meer tot de verbeelding spreekt (dat wat het eigenlijk doet), maar ook omdat je er dan makkelijk met Ctrl-click naar toe kan navigeren.

    De oplossing in dit geval is om niet de constructor, maar om LoadFromStream als virtual te declareren en díe in de afgeleide te overriden.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  3. #3
    oke super dankjewel!
    [Edit]
    Dit heeft inderdaad ook een aantal stream errors opgelost waar ik problemen kreeg met de stream data leeg was - wat klopte omdat ik na alles uit te lezen nog eens ging lezen, en dus de positie niet meer klopte.
    Last edited by Reidinga; 09-May-20 at 16:17.

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
  •