Results 1 to 11 of 11

Thread: Gebruik van variabelen in de baseclass

  1. #1
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747

    Gebruik van variabelen in de baseclass

    Vandaag had ik een beetje tijd om uit te zoeken wat de inheritance doet tussen twee verschillende classes (main en child). Ik heb daarvoor een voorbeeldje op het internet opgezocht en daar mee gespeeld. Op dat moment stond de baseclass en de childclass in 1 unit. Het werkt toen ook allemaal uitstekend.
    Ik ben verder aan het uitbreiden geweest om bijvoorbeeld een databaseconnection met een query in de baseclass te zetten. Omdat de child erft van de base ( TChild = class (TBase), kan ik 'extended classes' initialiseren en e.v.t. waarden toevoegen. Dat werkte toen nog steeds uitstekend en zag de logica er van in
    Nu heb ik de BaseClass en de ChildClass gescheiden in 2 units, waarvan unit2 de verwijzing naar unit1 heeft in de 'uses'. Maar nu kan ik geen gebruik meer maken van die variabelen en 'extended classes', die in de BaseClass staan.
    Dit is het punt, waarop het het even niet meer begrijp
    Ik heb een voorbeeld mee gestuurd voor de duidelijkheid.
    Attached Files Attached Files
    Delphi is great. Lazarus is more powerfull

  2. #2
    Die class variabelen ofwel fields zijn private. Private onderdelen van je class kun je normaliter alleen in je class zelf benaderen. Delphi maakt daar een uitzondering op omdat alles in de unit van de class er ook bij kan. De 'oplossing' in dit geval is om de variabelen protected te maken en/of er properties voor te maken.

    Overigens is het naming convention in Delphi om de namen van deze variabelen te beginnen met een 'F'.
    1+1=b

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Wat een beetje verplaatsen niet allemaal doet. Het werkt uitstekend. Nu kan ik tenminste een aantal handelingen uitvoeren in de baseclass, waar het in principe voor bedoeld is.
    Ik weet dat de class variabelen met een 'F' beginnen, maar dit is puur een voorbeeld geweest.

    Wat ik mijn alleen nog afvraag, waarom moeten deze variabelen in protected staan, als de classes in verschillende units staan. Want toen beide classen bij elkaar stonden werkten het private gedeelte ook.
    Delphi is great. Lazarus is more powerfull

  4. #4
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Zoals GT al zei, private is zichtbaar door de hele unit. Haal je ze uit de unit, moet je dus wat anders.

  5. #5
    Daardoor is er in de nieuwere versies strict private, kan niet door andere klasses in dezelfde unit gezien worden
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  6. #6
    Die ik dus ook altijd gebruik. Dan weet je zeker dat private/protected velden/variabelen niet "stiekem" door andere objecten in dezelfde unit mis/ge-bruikt kunnen worden. Tenzij dat echt is toegestaan
    I don't byte, I just nibble a bit.

  7. #7
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Ik doe dat nooit. Ik lig niet echt wakker van het probleem (en die ene keer dat ik classes van unit moet veranderen fix ik dat ene geval wel), en het maakt code delen met oudere delphi versies lastig. (strict private is D2006+ geloof ik, of al D2005?)

    Behalve Inline (onder ifdef) gebruik ik (nog) geen enkele post D7 vernieuwing. Herstel: 16 byte aligning in D2006 gebruik ik ook (voor SSE2 doeleinden), maar dat is strict genomen geen taal vernieuwing, maar vereist wel ifdef.
    Last edited by marcov; 19-Sep-08 at 11:43. Reason: mag niet liegen.

  8. #8
    Ik gebruik het in D2005
    I don't byte, I just nibble a bit.

  9. #9
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Ik heb geen problemen dat de variabelen in een baseclass op protected moet staan. Als dit eenmaal een regel is om deze te vinden in een child, doe ik dat gewoon. Het enige wat mij opviel is dat als de base en de child in 1 unit staan, het niet uitmaakt dat de de variabelen private of protected staan. Maar als de classes uit elkaar worden getrokken, moet het wel protected zijn. Dat is eigenlijk niet logisch. Als de base en child in de zelfde unit staan, zal de child de variabelen in de base, als zij in de private staan, niet moeten vinden.

    Eigenlijk vind ik dat niet kunnen. Volgens mij heb ik geleerd, dat variabelen en procedures / functies in protected ALLEEN voor de huidige class is.
    Delphi is great. Lazarus is more powerfull

  10. #10
    Door classes in dezelfde unit te plaatsen zijn ze "friend classes" geworden en daardoor mogen ze de private variabelen van elkaar gebruiken. Het is ook niet echt logisch en als backwards compatibility niet belangrijk was hadden ze strict private niet hoeven introduceren maar gewoon private echt private gemaakt.


    Maar zoals we allemaal weten: you don't want your friends to touch your privates .
    Marcel

  11. #11
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Dat is de view van een pure OOP kant. Maar Delphi is geen puur OOP, maar een hybride (een zg multiparadigm taal, procedureel/Modulair en OOP beide).

    Van de modulaire kant (unit systeem) kan je elke identifier zien, mits die eerder gedeclareerd is. Dat is waarschijnlijk ook de reden voor de originele definitie, een basis principe van Pascal.

Thread Information

Users Browsing this Thread

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

Tags for this Thread

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
  •