Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi class function oder neuer constructor (https://www.delphipraxis.net/75764-class-function-oder-neuer-constructor.html)

Jelly 24. Aug 2006 18:36


class function oder neuer constructor
 
Ich muss mir mal hier irgendwie klaren Kopf verschaffen. Und zwar grübel ich grad über Klassen Methoden nach, und deren Sinn in einem konkreten Fall...

Ich habe folgende, zugegeben, sehr simple Klasse:

Delphi-Quellcode:
unit Unit16;

interface

type
  TmyClass = class
  private
    FID: integer;
  public
     class function Load (AID : integer) : TmyClass ;

     property ID : integer read FID write FID ;
  end;

implementation
uses dialogs, SysUtils ;

{ TmyClass }

class function TmyClass.Load(AID: integer): TmyClass;
begin
     Result := Create ;
     Result.ID := AID ;
     Showmessage (inttostr(Result.ID)) ;
end;

end.
Diese Klassenmethode ermöglicht mir eine Instazierung folgender Art:

Delphi-Quellcode:
myObj := TmyClass.Load (123) ;
Ich hätte mir natürlich auch das Ganze per constructor gestalten können...

Delphi-Quellcode:
unit Unit16;

interface

type
  TmyClass = class
  private
    FID: integer;
  public
     constructor Load (AID : integer) ;

     property ID : integer read FID write FID ;
  end;

implementation
uses dialogs, SysUtils ;

{ TmyClass }

constructor TmyClass.Create(AID: integer) ;
begin
     ID := AID ;
     Showmessage (inttostr(ID)) ;
end;

end.
Aber das kann doch nicht der ganze Sinn von Klassenmethoden sein... Kann mir das mal einer näher erklären. Ich steh grad echt auf dem Schlauch, und seh grad nicht, was ich mit Klassenmethoden machen kann was nicht auch mit einem constructor ginge :wiejetzt:

Ein Beispiel wäre auch sehr lehrreich. :angel2:

Bernhard Geyer 24. Aug 2006 18:49

Re: class function oder neuer constructor
 
Da fällt mir schon einiges ein:

- Klasseninterne Zählung der Instanzen (ok. geht erst wirklich mit Klassenvariablen in neuesten Delphi-Versionen bzw. unter .NET) Ansonsten wird ein Unit-Private Zählvariable verwendet.
- In Basisklasse definierte Klassenverhalten das sich für ableitungen der Klasse ändert und auch ohne eine instanz der Klasse abfragbar sein soll. z.B. du unterstützt in deiner Anwendung mehrere DBMS-Systeme. Jedoch brauch das DBMS "A" einen installierten Client. Über eine Klassenmethode kannst Du nun abfragen ob diese DBMS überhaupt verwendbar ist. Könnte man sicher auch über einfache Funktionen/Methoden machen, aber als Klassenmethode ist es schicker.
- CoClasses von COM funktionieren so.

Jelly 24. Aug 2006 18:54

Re: class function oder neuer constructor
 
Also ist es prinzipiell so, dass ich Klassenmethoden aufrufen kann, ohne eine Instanz erzeugt zu haben... In der Klassenmethode wird dann entschieden, ob eine Instanz erzeugt werden darf, und gegebenfalls ein constructor aufgerufen. Oder es wird in einer Liste nach einer Klasse gescuht und gegebenfalls keine neue Instanz erzeugt sondern ein altes Objetk zurückgegeben..

Ich glaub ich habs gerafft :mrgreen:

alzaimar 24. Aug 2006 19:29

Re: class function oder neuer constructor
 
Jelly, eine Class Function muss doch nicht automatisch eine Instanz der Klasse liefern. Es gibt auch Fälle, in denen die Funktion semantisch zu der Klasse gehört (z.B. weil Sie irgendetwas prüft), aber keine Instanz der Klasse benötigt, um diese Prüfung (oder-was-weiss-ich) durchzuführen. Klar bräuchte man dafür keine Klassenfunktion, aber da diese Funktion nunmal semantisch zur Klasse gehört, packt man sie eben da rein. Und da sie keine Instanz benötigt, ist es eine Klassenfunktion und keine Methode.

Jelly 24. Aug 2006 20:22

Re: class function oder neuer constructor
 
Kannst Du mir mal ein Beispiel einer solchen Prüfung nennen.

edit: In diesem Thread hab ich noch einen interessanten Gesichtspunkt gelesen... und siehe, ich hatte sowas auch schon mal selbst für meine Diplomarbeit verwendet... Ich denk mal das ist recht anschaulich, hatte es nur wieder komplett vergessen.

alzaimar 25. Aug 2006 07:58

Re: class function oder neuer constructor
 
Hi,

Ich habe mal nachgeschaut:
1. Ich habe ein Error-Objekt, das in einer meiner Applikationen bestimmte Fehler über Systemgrenzen zum Client transportiert. Das könnte man als Exception-Objekt bezeichnen, aber das es in meiner Hierarchie ein Paket-Objekt ist (eins, das sich verschicken kann), habe ich es anders gewählt. Das Objekt wird in der Mittelschicht erzeugt und zum Client transportiert. Dort kann es eine Exception verursachen oder z.B. einen besonderen Dialog anzeigen, um diese Exception (oder Konflikt) aufzulösen.

So, was ist, wenn ich im Client selbst so eine Exception benötige? Ich habe nicht die gleiche Information wie im Server, brauche aber diese besondere Exception. Da das sematisch mit meinem TErrorObject zusammenhängt, habe ich eine 'Class Procedure TMyErrorClass.CauseException'. Die kann ich auslösen und gelange dann wohlgeordnet in den Programmfluss der Exceptionbehandlung.

Anderes Beispiel: In meinem DBMS existiert eine Klasse, die Streams in der DB verwaltet. Diese Klasse arbeitet mit einer 'Root-Page', in bestimmte Informationen stehen. Wenn ich diese Rootpage erzeugen will (in einer brandneuen DB), benötige ich keine Instanz eines 'TPagedStreams', sondern nur die 'Class Function CreateRootPage'.

Natürlich kann man das anders lösen, aber ich habe diesen Weg gewählt und finde es eben übersichtlicher, wenn eine Klasse nicht nur mit einer Instanz arbeiten kann, sondern auch die Vorbereitungen treffen kann, um diese Klasse überhaupt verwenden zu können.

Wenn man eine Klasse TNTFSDirectory hat, dann könnte man dann eine "Class Function TNTFSDirectory.CreateRoot" implementieren. Natürlich kann man dafür auch eine Klasse 'TNTFSSystem' schreiben und dort die Methode 'CreateRootDirectorY' implementieren, aber dann hätte man die 'Business logic' der Directory an zwei Stellen: Zum einen in den Methoden der TNTFSDirectory' und zum Anderen in der semantisch übergeordneten Klasse 'TNTFSSystem'. Und widerspricht meiner Prämisse, Business Logic zu konzentrieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz