AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi class function <> normale function mit Klassenzugehörigkeit?
Thema durchsuchen
Ansicht
Themen-Optionen

class function <> normale function mit Klassenzugehörigkeit?

Ein Thema von yankee · begonnen am 1. Mär 2007 · letzter Beitrag vom 2. Mär 2007
Antwort Antwort
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#1

class function <> normale function mit Klassenzugehöri

  Alt 1. Mär 2007, 18:13
Also ich probiere immernoch meine Sortierte Liste zu erstellen...

Nach dem ich mit den interfaces auf die Schnauze gefallen bin, versuche ich es jetzt mal anders:

Delphi-Quellcode:
unit USortedList;

interface

uses SysUtils, Contnrs, Dialogs;

type
   TSortedList =class(TObjectList)
     public
       Compare: function(o1,o2: TObject):integer;
       procedure Sort;
   end;

   TIntTest =class
     public
       v: integer;
       class function Compare(o1,o2: TObject):integer;
   end;

implementation

class function TIntTest.Compare(o1,o2: TObject):integer;
begin
  result :=TIntTest(o1).v-TIntTest(o2).v; //Stelle 3
end;

procedure TSortedList.Sort;
 procedure QuickSort(iLo, iHi: Integer);
 var
   Lo, Hi: Integer;
   Mid: TObject;
 begin
   Lo := iLo;
   Hi := iHi;
   Mid :=Items[(Lo + Hi) div 2]; //Stelle 1
   repeat
     while Compare(Mid,Items[Lo]) < 0 do Inc(Lo); //Stelle 2
     while Compare(Mid,Items[Hi]) > 0 do Dec(Hi);
     if Lo <= Hi then
     begin
       Exchange(Lo,Hi);
       Inc(Lo);
       Dec(Hi);
     end;
   until Lo > Hi;
   if Hi > iLo then QuickSort(iLo, Hi);
   if Lo < iHi then QuickSort(Lo, iHi);
 end;
begin
  if Assigned(Compare) then QuickSort(0,Count-1);
end;

end.
Weil ich immer eine AV bekommen habe, habe ich da mal durchgesteppt. Stoppunkt an Stelle 1.
Dann drücke ich F7 und erwarte, dass das Programm an Stelle 2 geht. Dies ist jedoch nicht der Fall, sondern es geht an Stelle 3 und ich kann mir keinen Reim darauf machen. Es gibt doch wirklich 0 Grund dazu.

Das kann eigentlich nur an einem Fehlverständnis von class functions meinerseits liegen, oder?
Die Delphiohilöfe macht sich zumindets bei mir nicht die Mühe diese zu dokumentieren... Könnt ihr mich aufklären (Ich ging bisher davon aus, dass dies eine ganz normale Funktion ist, die zwar von Name her zur Klasse gehört, aber sonst eigentlich eine ganz normale Funktion ist (das was in Java static ist)
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#2

Re: class function <> normale function mit Klassenzuge

  Alt 1. Mär 2007, 18:33
Class methods haben einen impliziten Parameter, in dem ein Zeiger auf die class reference übergeben wird.
So wie self bei einer Instanzmethode.
Ab Delphi2006 kann man class methods als "static" deklarieren, dadurch fällt der Parameter weg und sie verhalten sich exakt wie globale Funktionen.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#3

Re: class function <> normale function mit Klassenzuge

  Alt 1. Mär 2007, 19:07
Was hesisst ein implizieter Parameter? Wo kommt der denn her?
Und wie erklärt sich meine AV daraus?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#4

Re: class function <> normale function mit Klassenzuge

  Alt 1. Mär 2007, 22:56
Zitat von yankee:
Was hesisst ein implizieter Parameter? Wo kommt der denn her?
Hast du meinen Post nicht gelesen?
Wie kommt wohl das self in eine Instanzmethode? Und rate mal warum du self auch in Klassenmethoden benutzen kannst, nur ist dort self die MetaClass und nicht die Instanz.
Zitat:
Und wie erklärt sich meine AV daraus?
Was passiert wenn du eine Funktion, die 3 Parameter haben will per Gewalt in einen Funktionszeiger steckst, der nur 2 Parameter hat?
Genau das versuchst du nämlich in deinem Code, noch klarer kann ich das nun wirklich nicht ausdrücken.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#5

Re: class function <> normale function mit Klassenzuge

  Alt 2. Mär 2007, 06:43
Zitat von Elvis:
Hast du meinen Post nicht gelesen?
Wie kommt wohl das self in eine Instanzmethode? Und rate mal warum du self auch in Klassenmethoden benutzen kannst, nur ist dort self die MetaClass und nicht die Instanz.
Scheisskram, ich weiss schon mal nicht, was eine MetaClass ist und meine Delphihilfe kennt das Wort auich nicht.
Wie auch immer. Wenn es hier nur um normale Funktionen gehen würde würde ich dir zustimmen. Aber nicht so:
Delphi-Quellcode:
tmp :=TSortedList.Create;
  tmp.Compare :=@TIntTest.Compare;
Du hast ja recht, das Self definiert ist, aber wo kommt es her??
Zitat von Elvis:
Was passiert wenn du eine Funktion, die 3 Parameter haben will per Gewalt in einen Funktionszeiger steckst, der nur 2 Parameter hat?
Compilererror: Not enough Parameters.
Zitat von Elvis:
Genau das versuchst du nämlich in deinem Code, noch klarer kann ich das nun wirklich nicht ausdrücken.
Dann sag' mal, wie ich der Funktion den dritten Paramater übergebe.
Es kann ja wohl nicht sein, dass es eine Unmöglichkeit ist class-Functions aufzurufen.

Und noch ein Problem habe ich mir der Sache:
Wenn ich mit F7 da durchsteppe, wird meine class-Function schon aufgerufen bevor ich sie jemals aufrufe. WTF?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
heuckeg

Registriert seit: 6. Sep 2006
3 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: class function <> normale function mit Klassenzuge

  Alt 2. Mär 2007, 07:26
Hallo,

folgendes zu diesem Thema:
TObjectList ist von TList abgeleitet, und TList hat die Methode Sort, der eine Adresse auf eine selbst zu erstellende Funktion übergeben wird, die 2 Objekte vergleicht (mehr in der Delphi Hilfe und TList - Sort).

Beispiel:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}

uses
  sysutils,
  Contnrs;

type
   TIntTest =class
     public
       v: integer;
   end;


function CompareObjects(Item1, Item2: pointer): integer;

begin {CompareObject}
  result := 0;
  if TIntTest(Item1).v < TIntTest(Item2).v then
    result := -1
  else
    if TIntTest(Item1).v > TIntTest(Item2).v then
      result := 1;
end; {CompareObjects}


var
  i: integer;

  MeineListe: TObjectList;
  MeinObject: TIntTest;

begin
  try
    MeineListe := TObjectList.Create;

    // Testobject anlegen
    for i := 0 to 10 do
    begin
      MeinObject := TIntTest.Create;
      MeinObject.v := Random(100);
      MeineListe.Add(MeinObject);
    end;

    writeln('Vorher:');
    for i := 0 to MeineListe.Count - 1 do
      writeln(TIntTest(MeineListe[i]).v);

    MeineListe.Sort(CompareObjects);

    writeln('Nachher:');
    for i := 0 to MeineListe.Count - 1 do
      writeln(TIntTest(MeineListe[i]).v);

    readln;

    // Aufräumen...
    for i := 0 to MeineListe.Count - 1 do
    begin
      MeinObject := TIntTest(MeineListe[i]);
      MeinObject.Free;
    end;
  finally
    MeineListe.Free;
  end;
end.
Gruß,
Gunter
Gunter Heuckeroth
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: class function <> normale function mit Klassenzuge

  Alt 2. Mär 2007, 08:40
Zitat von yankee:
Scheisskram
Ok, aber warum sollte ich hier gross erklären, wenn es für dich eh "Scheisskram" ist? Warum sollte ich dann noch meine Zeit opfern?

Zitat von yankee:
... ich weiss schon mal nicht, was eine MetaClass ist und meine Delphihilfe kennt das Wort auich nicht.
1. Mein Delphi 5 kennt in der Hilfe schon den Begriff "Metaklassen" und bietet dazu gleich zwei ausführliche Themen mit Beispielen an. Mein Delphi 7 sowie BDS2006 bieten diese Hilfe genauso an unter dem Begriff.
2. Aber die Suche in der DelphiPraxis ergibt 4 Threads bei mir, wobei die letzten beide das gut erklären.

Zitat von yankee:
Delphi-Quellcode:
tmp :=TSortedList.Create;
  tmp.Compare :=@TIntTest.Compare;
Du hast ja recht, das Self definiert ist, aber wo kommt es her??
Er wird still und heimlich übergeben, da es sich um eine Methode handelt. Wenn es keine Methode ist sondern eine Procedure/Funktion, hast du auch kein Self.

Zitat von yankee:
Zitat von Elvis:
Was passiert wenn du eine Funktion, die 3 Parameter haben will per Gewalt in einen Funktionszeiger steckst, der nur 2 Parameter hat?
Compilererror: Not enough Parameters.
Ja, aber nur, wenn du die Compilertypprüfung nicht absichtlich umgehst. Dies machst du in deinem Code nunmal. Wenn du es auf einen untypisierten Zeiger umwandelst, was soll der Compiler dann noch überprüfen? Du zwingst ihn dazu, das als Zeiger zu verarbeiten und somit kann er sein Wissen über die Methode und deren Signatur nicht mehr anwenden. Jede Sprache kann noch so typsicher sein, wenn man mit Pointern arbeiten kann ist alles für die Katz' bzw. übergehbar. Du schiesst diese Typprüfung mit deinem Code selber ab. Das sie funktioniert hattest du selber mitbekommen, als du es ohne die @ kompilieren wolltest - aber egal, das war zumindest von dir gemachter "Scheissdreck".

Zitat von yankee:
Dann sag' mal, wie ich der Funktion den dritten Paramater übergebe.
Es kann ja wohl nicht sein, dass es eine Unmöglichkeit ist class-Functions aufzurufen.
Nein, ist es nicht, aber da du es so nicht verstehst, mal ein anderes Beispiel dazu:

Wie würdest du folgendes Problem lösen: Du hast ein Bohrloch mit metrischen Schraubgewinde. Dazu stehen dir eine passende Schraube zur Verfügung sowie eine Nietmaschine, deren Nieten den gleichen Umfang haben. Womit würdest du nun ein Blech mit Loch an dem Loch mit Gewinde anbringen? In deinem Code machst du es zZ mit der Niete obwohl der Compiler sich sogar dagegen wehrt.

Sort() gibt fest vor, welche Art von Procedure/Funktion er in welcher Form haben will. Dies braucht er auch, damit er so den Aufruf tätigen kann und somit auch fest weiss wieviele Parameter er übergeben muss und auch entsprechend wann abräumen muss. Wenn du nun aber ganz stur mit deiner Niete (Class Method) kommst, dann wird das nix. Sort will keine Class Procedure und somit steht es hier ausser Frage unbedingt eine nehmen zu wollen. Sort gibt dir vor, wie deine Sortierungsfunktion auszusehen hat - wenn du das nicht willst oder die Class Procedure nutzen willst, dann implementiere Sort komplett selber.

Und zu deiner Grundaussage zu kommen: Sort ruft die Procedure auf und nicht du, somit kannst du auch nicht einen Parameter zusätzlich übergeben.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#8

Re: class function <> normale function mit Klassenzuge

  Alt 2. Mär 2007, 16:04
Zitat von Muetze1:
Zitat von yankee:
Scheisskram
Ok, aber warum sollte ich hier gross erklären, wenn es für dich eh "Scheisskram" ist? Warum sollte ich dann noch meine Zeit opfern?
Sry, das ist jetzt falsch rübergekommen. Das war mehr lustig gemeint.

Zitat von Muetze1:
1. Mein Delphi 5 kennt in der Hilfe schon den Begriff "Metaklassen" und bietet dazu gleich zwei ausführliche Themen mit Beispielen an. Mein Delphi 7 sowie BDS2006 bieten diese Hilfe genauso an unter dem Begriff.
*nachmal genau such*... Mhh... is nix...
Zitat von Muetze1:
2. Aber die Suche in der DelphiPraxis ergibt 4 Threads bei mir, wobei die letzten beide das gut erklären.
Ich bekomme ein paar mehr Ergebnisse, aber in keinem scheinen Metaklassen mal erklärt zu werden...
Aber vielleicht kannst du ja mal einen Links posten.

Zitat von Muetze1:
Er wird still und heimlich übergeben, da es sich um eine Methode handelt. Wenn es keine Methode ist sondern eine Procedure/Funktion, hast du auch kein Self.
jaaa... soweit bin ich auch schon... Aber ich würde gerne wissen WAS FÜR SELF still und heimlich übergeben wird!

...

Vom Rest deines Beitrages lese ich, dass du mir schreiben willst, dass dies:
Delphi-Quellcode:
   TSortedList =class(TObjectList)
     public
       Compare: function(o1,o2: TObject):integer; // hier
       procedure Sort;
falsch ist. Aber WIE mache ich es denn richtig???

@heuckeg:
Wenn ich bednke, wie oft ich schon kritisiert habe, dass Delphi eine solche Funktion nicht hat und mir nie jemand wiedersprochen hat, ist das ganz schön überraschend, dass sowas mal kommt. Aber gut zu wissen, dann kann ich ja eigentlich auch die benutzen
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: class function <> normale function mit Klassenzuge

  Alt 2. Mär 2007, 21:17
Zitat von yankee:
Zitat von Muetze1:
1. Mein Delphi 5 kennt in der Hilfe schon den Begriff "Metaklassen" und bietet dazu gleich zwei ausführliche Themen mit Beispielen an. Mein Delphi 7 sowie BDS2006 bieten diese Hilfe genauso an unter dem Begriff.
*nachmal genau such*... Mhh... is nix...
Ok, habe hier nochmal Delphi 6 Enterprise (also deine Version) gestartet und in der Hilfe unter "Index" finde ich nach Eingabe von "Metaklassen" direkt einen Eintrag. Dieser gibt mir zwei direkte Themen zur Wahl an nach der Auswahl.

Zitat von yankee:
Zitat von Muetze1:
Er wird still und heimlich übergeben, da es sich um eine Methode handelt. Wenn es keine Methode ist sondern eine Procedure/Funktion, hast du auch kein Self.
jaaa... soweit bin ich auch schon... Aber ich würde gerne wissen WAS FÜR SELF still und heimlich übergeben wird!
Das wurde oben schon erklärt. Bei einer Class Method die Metaklasse und bei einer Methode die Instanz, deren Methode aufgerufen wurde.

Zitat von yankee:
Vom Rest deines Beitrages lese ich, dass du mir schreiben willst, dass dies:
Delphi-Quellcode:
   TSortedList =class(TObjectList)
     public
       Compare: function(o1,o2: TObject):integer; // hier
       procedure Sort;
falsch ist. Aber WIE mache ich es denn richtig???
Das hat dir heuckeg in seinem Code gezeigt. Einfach von ihm nehmen, kopieren und vielleicht anpassen. Nutze eine stinknormale Procedure - keine Methode und keine Class Method.
  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 12:20 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