Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "Unbekannter Bezeichner" bei Eigenschaft eines Objektes (https://www.delphipraxis.net/78990-unbekannter-bezeichner-bei-eigenschaft-eines-objektes.html)

mkinzler 14. Okt 2006 11:19

Re: "Unbekannter Bezeichner" bei Eigenschaft eines
 
Nein, das geht so nicht. Du solltset dich mal mit den Grundlagen der OOP beschäftigen, dann wirst du dessen Vorteile schnell zu schätzen wissen.

xaromz 14. Okt 2006 11:19

Re: "Unbekannter Bezeichner" bei Eigenschaft eines
 
Hallo,
Zitat:

Zitat von BillieJoe90
Mir ist grad eine Idee gekommen, aber ich bezweifle, dass das um zu setzen ist:
Gibt es in Delphi die Möglichkeit, einen "Link" zu setzen.

Das geht durchaus. Nennt sich Pointer. Jedes Objekt ist eigentlich ein Pointer.
Zitat:

Zitat von BillieJoe90
Jetzt mal ein Beispiel:
Delphi-Quellcode:
procedure Irgendwas();
  var
    Feld:Array[1..41] of Link; //oder wie es halt heißt...
    Feld1:TGrundstueck;
    Feld2:TWasAnderes;
begin
  Feld[1] := Feld1;
  Feld[1].methodeVonTGrundstueck();
end;
Versteht ihr, was ich meine?

Das Problem ist, dass Du dann (wenn Du Link durch Pointer ersetzt) wieder nur einen untypisierten Pointer hast. Du musst also das Array so deklarieren:
Delphi-Quellcode:
Feld:Array[1..41] of TGrundstueck;
Denn da Delphi keine Interpretersprache ist, gibt es auch niemanden, der zur Laufzeit den Typ ermitteln kann.

Gruß
xaromz

BillieJoe90 14. Okt 2006 11:21

Re: "Unbekannter Bezeichner" bei Eigenschaft eines
 
Ich krieg die Krise... :wall:
Aber danke trotzdem für die Antworten!

Sprich, mein Problem ist "unlösbar"? :(

mkinzler 14. Okt 2006 11:28

Re: "Unbekannter Bezeichner" bei Eigenschaft eines
 
Zitat:

Sprich, mein Problem ist "unlösbar"? Sad
Dein Problem ist nicht wirklich ein Problem.

Das Prinzip der OOP ist, daß abgeleitetet Klassen, sich wie ihre Superklassen verhalten können und nicht umgekehrt.

Du könntest höchstens alle Eigenschaften der (abgeleiteten) Klassen in die Superklasse packen :

Statt
TSuperKlasse
-allg. Eigenschaften
-allg. Methoden
-> TSpezKlasse1
-Eigenschaften Spez1
-Methoden Spez1
-> TSpezKlasse2
-Eigenschaften Spez2
-Methoden Spez2

also
TIchScheissAufOOP_Klasse
-allg. Eigenschaften
-allg. Methoden
-Eigenschaften Spez1
-Methoden Spez1
-Eigenschaften Spez2
-Methoden Spez2

xaromz 14. Okt 2006 11:29

Re: "Unbekannter Bezeichner" bei Eigenschaft eines
 
Hallo,
Zitat:

Zitat von BillieJoe90
Ich krieg die Krise... :wall:

Immer locker bleiben :wink:
Zitat:

Zitat von BillieJoe90
Sprich, mein Problem ist "unlösbar"? :(

Ich weiß nicht. Was ist denn Dein Problem?

Gruß
xaromz

bttb930 14. Okt 2006 11:31

Re: "Unbekannter Bezeichner" bei Eigenschaft eines
 
Zitat:

Zitat von BillieJoe90
Aber ehrlich gesagt möchte ich das nicht immer so schreiben

Tja... was soll man dazu sagen??

Was greifst Du auch auf ein Feld zu, das TFeld nicht besitzt? Das ist soundso schon nicht sehr objektorientiert. Vielleicht ist es am besten, wenn Du einfach prozedural programmierst - Objektorientierung sieht nämlich komplett anders aus als Dein Code.

BillieJoe90 14. Okt 2006 11:39

Re: "Unbekannter Bezeichner" bei Eigenschaft eines
 
Zitat:

Zitat von xaromz
Hallo,
Zitat:

Zitat von BillieJoe90
Ich krieg die Krise... :wall:

Immer locker bleiben :wink:
Zitat:

Zitat von BillieJoe90
Sprich, mein Problem ist "unlösbar"? :(

Ich weiß nicht. Was ist denn Dein Problem?

Gruß
xaromz

Mein Problem ist, dass ich Monopoly programmiere und für jeden Typ von Feld eine eigene Klasse haben möchte, trotzdem die Felder aber per Feld[i] anwählen können möchte.
Wenn mir keiner helfen kann, mache ich es so, dass eine Klasse für alle da ist und je nachdem, was für einen Typ die Instanz hat, reagieren die Methoden... Nicht sonderlich elegant, aber es wird nicht anders gehen...

mkinzler 14. Okt 2006 11:42

Re: "Unbekannter Bezeichner" bei Eigenschaft eines
 
Zitat:

Mein Problem ist, dass ich Monopoly programmiere und für jeden Typ von Feld eine eigene Klasse haben möchte, trotzdem die Felder aber per Feld[i] anwählen können möchte.
das kannst du doch problemlos, nur wenn du spezielle Eigenschaften bzw. Methoden der speziellen Klasse verwenden willst, mußt du dem Compiler halt sagen, daß er die Instanz als solche betrachten soll. Woher soll er es denn sonst wissen?

bttb930 14. Okt 2006 11:46

Re: "Unbekannter Bezeichner" bei Eigenschaft eines
 
Zitat:

Zitat von BillieJoe90
Mein Problem ist, dass ich Monopoly programmiere und für jeden Typ von Feld eine eigene Klasse haben möchte, trotzdem die Felder aber per Feld[i] anwählen können möchte.
Wenn mir keiner helfen kann, mache ich es so, dass eine Klasse für alle da ist und je nachdem, was für einen Typ die Instanz hat, reagieren die Methoden... Nicht sonderlich elegant, aber es wird nicht anders gehen...

Na, grundsätzlich kann man das so machen, man muss aber die Arbeit DELEGIEREN! Das heißt:

NICHT je nach Typ dies oder das tun

SONDERN unabhängig vom Typ immer das gleiche tun - das ist aber bei jedem Typ anders deklariert.

Dies machst Du mit virtuellen Methoden:

Delphi-Quellcode:
type
  TPerson = class
  private
    FName: string;
  public
    property Name: string read FName write FName;
  end;

  TCommonField = class
  private
    ...
  public
    procedure Enter(APerson: TPerson); virtual; abstract;
  end;

  TNorthStation = class(TCommonField)
  private
    ...
  public
    procedure Enter(APerson: TPerson); override;
  end;

  TKnast = class(TCommonField)
  private
    ...
  public
    procedure Enter(APerson: TPerson); override;
  end;

...

procedure TNorthStation.Enter(APerson: TPerson);
begin
  ShowMessage(APerson.Name + ' auf Nordbahnhof');
end;

procedure TKnast.Enter(APerson: TPerson);
begin
  ShowMessage(APerson.Name + ' im Knast');
end;

var
  Person1: TPerson;
  Knast: TKnast;
  Nordbahnhof: TNorthStation;
  Feld: TCommonField;
begin
  Person1 := TPerson.Create;
  Person1.Name := 'Billy Joe';
  Knast := TKnast.Create;
  Nordbahnhof := TNorthStation.Create;

  Feld := Knast;
  Feld.Enter(Person1);
 
  Feld := Nordbahnhof;
  Feld.Enter(APerson);
end;
Die beiden Enter-Methoden sind jeweils anders implementiert. In deiner Prozedur bekommst Du ein Field: TCommonField und rufst lediglich Field.Enter(APerson) auf. Fertig.

BillieJoe90 14. Okt 2006 12:10

Re: "Unbekannter Bezeichner" bei Eigenschaft eines
 
An bttb930:
Das sieht gut aus :)
Aber folgende Fehlermeldungen: :gruebel:

Undefinierter Bezeichner 'ShowMessage'
Undefinierter Bezeichner 'ShowMessage'


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 Uhr.
Seite 2 von 3     12 3      

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