AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

class function oder neuer constructor

Ein Thema von Jelly · begonnen am 24. Aug 2006 · letzter Beitrag vom 25. Aug 2006
Antwort Antwort
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#1

class function oder neuer constructor

  Alt 24. Aug 2006, 19:36
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:

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

Ein Beispiel wäre auch sehr lehrreich.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: class function oder neuer constructor

  Alt 24. Aug 2006, 19:49
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#3

Re: class function oder neuer constructor

  Alt 24. Aug 2006, 19:54
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: class function oder neuer constructor

  Alt 24. Aug 2006, 20:29
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#5

Re: class function oder neuer constructor

  Alt 24. Aug 2006, 21:22
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.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: class function oder neuer constructor

  Alt 25. Aug 2006, 08:58
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz