Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Vererbung nur public


knittel - Mo 18.10.10 17:45
Titel: Vererbung nur public
Hallo Leute,
Ich habe ein Problem. Ich programmiere ein kleines 2D Spiel. Dabei soll es Gebäude und Einheiten geben.

Dabei habe ich ein paar Klassen erstellt:
TGameObject: Überklasse (beinhaltet Textur, Name und X,Y Position)
in der Datei RTSUnit

TUnit: Unterklasse von TGameObject (beinhaltet Geschwindigkeit und Ziel, etc.)
in der Datei RTSUnit

TStructure: Unterklasse von TGameObject (beinhaltet keine weiteren Werte)
in der Datei RTSStructure

In dem constructor von TStructure steht folgendes:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
constructor TStructure.Create(StructureType, AtX, AtY: cardinal);
begin
inherited Create (AtX, AtY); // Bezogen auf den Constructor von TGameObject
case StructureType of // Bestimmen um welche Einheit es sich handelt.
  0: FTexture := 'powerplant';
  end;
FImageIndex := FindImageIndex (); // Bestimmen welchen Index das Bild in der ImageList hat.
end;


Und in dem Constructor von TGameObject steht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
constructor TGameObject.Create (AtX, AtY: cardinal);
begin
FXpos := AtX; // Bestimmen der X Position
FYpos := AtY; // Bestimmen der Y Position
FMarked := false; // Die Einheit ist nicht markiert
end;


Das eigentlich Problem ist: Delphi meckert weil er FImageIndex und FTexture nicht kennt.
FImageIndex und FTexture sind beides private deklarierte Variablen von TGameObject. Da ich aber ja RTSUnit schon im interface von RTSStructure eingebunden habe müsste es eigentlich keine Probleme geben. Außerdem erkennt Delphi schon, dass TStructure von TGameObject erbt, aber irgendwie erbt er die private deklarierten Variablen nicht oder erkennt sie nicht.

Wie könnte ich das Problem lösen?

Danke im voraus.

P.S. Falls ihr mehr Code braucht um mir zu helfen, siehe Anhang.

Moderiert von user profile iconNarses: Code als Anhang hochgeladen.


bummi - Mo 18.10.10 17:58

Du hast keinen Zugriff auf private Variablen,etc.

für FTexture hast Du ja schon einen Setter/Getter Texture
für FImageIndex kannst Du einen ebensolchen implementieren

oder die Variablen inden public Bereich ziehen (dann aber nicht mehr FVariablenname nennen)


jaenicke - Mo 18.10.10 18:40

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
oder die Variablen inden public Bereich ziehen (dann aber nicht mehr FVariablenname nennen)
Nein, public ist für nach außen hin sichtbare Felder. Wenn die abgeleiteten Klassen die Felder sehen sollen, gehören die unter protected. Dann sind diese nicht nach außen sichtbar, aber in der eigenen und abgeleiteten Klassen.


knittel - Di 19.10.10 14:00

Ich probiers jetzt gleich mal aus.
Vielen Dank. :)


Flamefire - Di 19.10.10 16:38

Für den Zugriff von abgeleiteten Klassen auf die Eigenschaftenn der Überklasse sollte man eigendlich keine Getter/Setter verwenden. Zumindest nicht, wenn es nicht gebraucht wird.
Darum: protected

public: für alle sichtbar
private: nur für eigene klasse sichtbar
protected: für eigene und abgeleitete klassen sichtbar. aber nicht nach außen


jaenicke - Di 19.10.10 16:40

user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
private: nur für eigene klasse sichtbar
Um genau zu sein auch innerhalb der Unit. Nur innerhalb der Klasse geht mit "strict private".


Flamefire - Di 19.10.10 16:45

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
private: nur für eigene klasse sichtbar
Um genau zu sein auch innerhalb der Unit. Nur innerhalb der Klasse geht mit "strict private".

Gleiches gilt für protected. Da ebenfalls ein "strict" davor, wenn mans brauch.