Results 1 to 8 of 8

Thread: Overerving Objecten

  1. #1

    Overerving Objecten

    Hallo,

    Ik heb de volgende constructie.
    Er is een basis Approver object echter het controleren van de credentials kan per type gebruiker variëren.
    het basisobject ziet er als volgt uit
    Code:
     TApprover = class(Tobject)
      private
        Flevel: integer;
        FAutMark: boolean;
        Fdatum: string;
        FNaam: integer;
        FPinCode: integer;
        FAfdeling: TAfdeling;
    
      public
       function CheckCredentials(checkRole:boolean) :boolean; overload; virtual;
       function CheckCredentials :boolean; overload; virtual;
       function CheckRegNr: boolean; virtual;
       Constructor Create;  virtual;
       Destructor Destroy;  override;
      Published
       property Naam: integer   read FNaam write FNaam;
       property Datum: string   read Fdatum write FDatum;
       property AutMArk:boolean  read FAutMark write FAutMark;
       property Level:integer    read Flevel write Flevel;
       property Pincode:integer read Fpincode write FPinCode;
       property Afdeling: TAfdeling read FAfdeling write FAfdeling;
     end;
    Voor een specifieke approver heb ik bijvoorbeeld een TVoormanApprover gedifineerd
    Ditzelfde heb ik gedaan voor een Manager of voor een Engineer.
    Code:
     TVoormanApprover = Class(TApprover)
     public
       function CheckCredentials :boolean; override  ;
     end;

    In mijn code roep ik dit op de volgende manier aan
    Code:
     Approver:=Tapprover.Create;
     Approver.Naam:=strtoint(txtRegNr.Text);
     Approver.Pincode:=strtoint(txtPinCode.Text);
     result:= TVoormanApprover(Approver).CheckCredentials;
     if not result then
      result:= TManagerApprover(Approver).CheckCredentials;
    Als ik deze code uitvoer beland ik steeds in de TApprover.Credentials
    Ik wil dus de credentials kunnen controleren als een Voorman en als een TManager

    Wat doe ik verkeerd.

  2. #2
    Senior Member EricLang's Avatar
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,377
    De typecasting is illegaal. je hebt een classe TApprover en die kun je niet zomaar typecasten naar een andere klasse.

  3. #3
    Quote Originally Posted by cpri View Post
    In mijn code roep ik dit op de volgende manier aan
    Code:
     Approver:=Tapprover.Create;
     Approver.Naam:=strtoint(txtRegNr.Text);
     Approver.Pincode:=strtoint(txtPinCode.Text);
     result:= TVoormanApprover(Approver).CheckCredentials;
     if not result then
      result:= TManagerApprover(Approver).CheckCredentials;
    Als ik deze code uitvoer beland ik steeds in de TApprover.Credentials
    Ik wil dus de credentials kunnen controleren als een Voorman en als een TManager
    Waarom doe je dan niet direct Approver := TVoormanApprover.Create ???
    Dan maak je Approver een TVoormanApprover en hoef je niet eens een cast uit te voeren.

  4. #4
    Klopt maar dan moet ik zo wel voor de TMtapprover en wie weet nog meer een approver aanmaken.
    Ik dacht op deze manier maar 1 approver te hoeven aan te maken en deze als verschillende instanties te kunnen gebruiken

    Als er andere technieken zijn hoor ik dit ook graag

  5. #5
    Ja, maar hier maak je een TApprover aan. Geen TVoormanApprover
    Approver:=Tapprover.Create

    Die zal dus nooit en te nimmer de CheckCredentials van TVoormanApprover uit kunnen voeren.

    Je zou wel kunnen denken aan static procedure of functie.
    Maar wellicht moet je het een en ander op de schop gooien.

    Ps. Je kunt een algemene functie maken waarbij je de classtype meegeeft als parameter waar je dan wel create mee kunt doen.

    Pps. Waarom in hemelsnaam zou je een TVoormanApprover.CheckCredentials hebben als je object een TApprover is? Dan behoort de CheckCredentials ook de Voorman Credentials te checken. Anders zul je met aparte functies moeten werken maar zoals je het nu wil is niet zoals object orientated programming in elkaar zit.

  6. #6
    Dus als ik het goed begrijp moet ik een set maken met approver types
    Code:
    TypeApprover = (TA_Voorman, TA_Manager)
    Hierna moet ik dan bij de aanroep van checkcredentials iets doen als
    Code:
     if not Approver.CheckCredentials(TA_Voorman) then
    begin 
     showmessage('credentials zijn niet juist');
     exit;
    end;

  7. #7
    Ja. In jouw geval kun je je namelijk afvragen waarom je een aparte TManagerApprover en TVoormanApprover hebt puur alleen om de CheckCredentials. Het kan wel maar dan moet je inderdaad elk object apart aanmaken om de CheckCredentials uit te voeren.

    Een functie-veld in TApprover zou dit inderdaad op kunnen lossen.
    Je kunt ook een class method maken

    Delphi Code:
    1. type
    2.   TVoormanApprover = Class(TApprover)
    3.   public
    4.     class function CheckCredentials(Naam, Pincode: String):boolean;
    5.   end;
    en die zo aanroepen
    Delphi Code:
    1. result:= TVoormanApprover.CheckCredentials(txtRegNr.Text, txtPincode.Text);

    Voor een class method hoeft het object zelf niet te bestaan en kun je dus direct die functie gebruiken op de classnaam.
    Alleen of dat handiger is hangt van de rest van je ontwerp af.

    (Ook een class method kun je met virtual en override doen)

  8. #8
    of de credentials meegeven als parameter tijdens het creëren van de Approver
    Code:
    Voorman:=Tapprover.Create(ctVoorman);
    Manager:=Tapprover.Create(ctManager);
    Maar de beste oplossing is uiteraard afhankelijk van wat je uiteindelijk wilt bereiken en aangezien we dat niet weten ...

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
  •