Autor Beitrag
catweasel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Sa 15.11.03 01:08 
Hi,

um das Prinzip von OOP etwas zu studieren habe ich ein wenig in den Standart Units von Delphi herumgeschaut um zu sehen wie Methoden dort vereinbart und implementiert sind...

Dabei ist mir etwas aufgefallen:

Es gibt Methoden die sind als :

ausblenden Quelltext
1:
function beispiel(werte : integer) : integer; virtual;					


deklariert.... Andere wiederum als

ausblenden Quelltext
1:
class function beispiel(werte : integer) : integer; virtual;					


Die Delphi Hilfe sagt dazu lediglich... (Hier mal der Hilfetext):

Zitat:
A class method is a method (other than a constructor) that operates on classes instead of objects. The definition of a class method must begin with the reserved word class. For example,

type

TFigure = class
public
class function Supports(Operation: string): Boolean; virtual;
class procedure GetInfo(var Info: TFigureInfo); virtual;
...
end;

The defining declaration of a class method must also begin with class. For example,

class procedure TFigure.GetInfo(var Info: TFigureInfo);

begin
...
end;

In the defining declaration of a class method, the identifier Self represents the class where the method is called (which could be a descendant of the class in which it is defined). If the method is called in the class C, then Self is of the type class of C. Thus you cannot use Self to access fields, properties, and normal (object) methods, but you can use it to call constructors and other class methods.
A class method can be called through a class reference or an object reference. When it is called through an object reference, the class of the object becomes the value of Self.


Das hört sich ganz so an wie das was ich mir unter einer "normalen" Funktion ohne den class-Zusatz vorstelle...

Wo ist also der Unterschied ?????

Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Sa 15.11.03 01:29 
Titel: Re: Was macht eine "Class Methode" anders als eine
catweasel hat folgendes geschrieben:
habe ich ein wenig in den Standart Units von Delphi herumgeschaut

Wo gibt es diese Standart Units denn? Auf welche Art stehen diese denn im Speicher? Aufrecht, gebeugt, ... ?


Zitat:
Die Delphi Hilfe sagt dazu lediglich...

Wenn man genau weiß, was die Begriffe Klasse und Objekt bedeuten, dann ist die Aussage der Hilfedatei um einiges mehr als "lediglich".


Zitat:
Wo ist also der Unterschied ?????

Bei einer "normalen" Methode wird als Self eine Instanz (das Objekt) der Klasse übergeben. Mit dieser kannst du dann ohne Angabe von Self arbeiten.

Bei einer Klassenmethode wird als Self keine Instanz übergeben, sonder die Klasse selbst. Bei einer Klasse kannst du nicht auf die Eigenschaften zugreifen, da es sich bei der Klasse ja nur um den "Bauplan" handelt und nicht um ein "Objekt im Speicher". In einer Klassenmethode kannst du andere Klassenmethoden aufrufen, aber auch den constructor, der dir dann eine Instanz der Klasse liefert.

_________________
Ist Zeit wirklich Geld?
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Sa 15.11.03 01:35 
Titel: hmm,
um es relativ einfach zu erklären, mach ich es an Klassenvariablen. Eine Klassenavriable gibt es nur einmal , eine Instanzvariable gibt es für jedes Objekt seperat. Sprich die Klassenvariable ist für jede Instanz der Klasse die selbe.

Kann man sich so vorstellen. Im Konstruktor setzt du eine Klassenvariable 'ANZAHLINSTANZEN' um eins hoch im Destructor decrementierst du. So weiss dein Programm immer vieviele Instanzen das Programm gerade laufen hat. Macht zB. SInn wenn man Threads benutzt um zu gucken ob das Programm gerade den Rechner lahmlegen will durch kontinuierliches Threadanlegen usw...

Klassenmethoden sind nichts anderes , sie wirken eben auch immer auf alle Instanzen ein.

_________________
mfg. Joel
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Sa 15.11.03 02:07 
Hi,

@AndyB

Zitat:
Wo gibt es diese Standart Units denn? Auf welche Art stehen diese denn im Speicher? Aufrecht, gebeugt, ... ?


Naja, mit Standartunits meine ich z.b die SysUtils,ExtControls, etc, eben die, die bei Delphiprojekten standartmässig eingebundenwerden...

Sorry wenn das möglichweise eine laienhafte Umschreibung war :nixweiss:

Aber, wie einige vielleicht schon gemerkt haben, schreibe ich in letzter Zeit öfters was in dieses Forum.
Wahrscheinlich wie viele andere aus dem gleichen Grund:
Um etwas zu lernen.
Und: Nur selber fragen macht schlau..

Zitat:
Wenn man genau weiß, was die Begriffe Klasse und Objekt bedeuten, dann ist die Aussage der Hilfedatei um einiges mehr als "lediglich".


Und was folgern wir daraus...?
Ich weiss es möglicherweise (noch) nicht.....


@ JoelH

Zitat:
um es relativ einfach zu erklären, mach ich es an Klassenvariablen. Eine Klassenavriable gibt es nur einmal , eine Instanzvariable gibt es für jedes Objekt seperat. Sprich die Klassenvariable ist für jede Instanz der Klasse die selbe.


Hab ich das richtig verstanden :

Wenn ich z.b. eine Methode

ausblenden Quelltext
1:
class procedure setfarbe(farbe: TColoe);					


deklariere, dann ändert sich bei ihrem Aufruf die Farbe aller Instanzen der Klasse der diese Methode angehört.

Ich bemühe mich ewrnsthaft OOP zu verstehen, deshlab frage ich halt öfters mal nach....

Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Sa 15.11.03 03:38 
catweasel hat folgendes geschrieben:
Wenn ich z.b. eine Methode

ausblenden Quelltext
1:
class procedure setfarbe(farbe: TColoe);					


deklariere, dann ändert sich bei ihrem Aufruf die Farbe aller Instanzen der Klasse der diese Methode angehört.


sollte sie.

_________________
mfg. Joel
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Sa 15.11.03 12:25 
Zitat:
sollte sie.


Das glaub ich nicht...TIM! Klassen methoden haben keinen bezug auf die realen daten der instanzen, wie auch, dann müsste eine klasse sich ja alle referenzen merken.

_________________
mfg.
mâximôv
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Sa 15.11.03 13:27 
catweasel hat folgendes geschrieben:
Naja, mit Standartunits meine ich z.b die SysUtils,ExtControls, etc, eben die, die bei Delphiprojekten standartmässig eingebundenwerden...

Da hast du mich völlig falsch verstanden. Ich sage es nun mal ohne Umschreibung: Das Wort heist Standard und nicht Standart. Letzeres ist die Art zu Stehen. Ersteres ist eine Vorgabe, die von einer Gesellschaft akzeptiert wird.

_________________
Ist Zeit wirklich Geld?
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Sa 15.11.03 13:34 
In Sprachen wie Java gibt es sowohl Klassenmethoden als auch -felder. In ObjectPascal gibt es nur Klassenmethoden. Diese können weitere Klassenmethoden oder einen Konstruktor aufrufen, jedoch haben sie keinen Zugriff auf Instanzfelder, da Klassenmethoden nicht im Kontext eines Objektes, also einer Instanz, aufgerufen werden, sondern im Kontext einer Klasse. Man braucht also keine Variable eines Typs zu deklarieren, um eine Klassenmethode aufzurufen; man kann Klassen, die nur Klassenmethoden enthalten, als eine Art Container für ähnlichartige Funktionen betrachten.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
Mossi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99
Erhaltene Danke: 2

Win XP, Linux
D7 Enterprise, K3 Prof
BeitragVerfasst: Mo 24.11.03 13:00 
Dabei stellt sich für mich gleich die Frage, ob man in Delphi auch irgendwie solche "Klassenfelder" bzw static fields abbilden kann wie in Java.

Und dabei wollte ich gleich mal fragen, ob es irgendwo im Netz eine gute Dokumentation über OOP in Delphi gibt. Dabei stelle ich mir eine Doku vor, in der auch die Anweisungen overload, virtual... ausführlich auf ihre Funktion hin erklärt werden. Ich hab jetzt schon ein paar mal nach Dokus in dieser Art gesucht, finde aber meistens nur Fragmente und keine komplette Dokumentation.