![]() |
Strukturierungsproblem (Units, Klassen)
Hi!
Mein bisheriger Programmaufbau (bestehend aus 3 Units) sieht skizziert so aus:
Delphi-Quellcode:
unit Unit1;
uses {...} Unit2, Unit3; interface type TForm1 = class(TForm) {...}
Delphi-Quellcode:
unit Unit2;
interface type TKlasse1 = class private {...} end; TKlasse2 = class private Field: array of TKlasse1; public {...} end; {...}
Delphi-Quellcode:
TForm1 kann also auf einige Methoden von TKlasse2 und TKlasse3 zugreifen. Nun soll TKlasse3 aber auf die Eigenschaften zugreifen, die im private-Teil von TKlasse1 stehen, TForm1 darf das nicht. Sollte ich TKlasse3 dazu auch in Unit2 zu stecken? Oder gibt es eine Möglichkeit, bei der TKlasse3 weiterhin in einer eigenen Unit stehen kann? Was müsste ich dazu umbauen?
unit Unit3;
interface type TKlasse3 = class private {...} public {...} end; {...} |
Re: Strukturierungsproblem (Units, Klassen)
Hi,
also du hast dir ja was dabei gedacht, die Klasse3 in eine eigene Unit zu stecken, oder ? Wenn also jetzt diese Klasse auf private Elemente der anderen Klasse zugreifen soll, dann sind die entweder nicht wirklich so privat, oder Klasse3 steht doch in einem engeren Zusammenhang zu Klasse1 und Klasse2. Dann wäre es natürlich sinnvoll diese in der selben unit zu haben. Denk nochmal über die Zusammenhänge der drei Klassen untereinander nach, dann kommst du auf die für dich richtige Lösung. Gruss Thomas. |
Re: Strukturierungsproblem (Units, Klassen)
Du hast ja mehrere Möglichkeiten in einer Klasse Sichtbarkeiten festzulegen. Dir steht dafür private, protected, public und published zur Verfügung. Wenn du nun in einer Klasse Dinge im private Abschnitt der Klasse deklarierst, dann definierst du, dass nur noch diese Klasse und keine abgeleitete Klasse und auch keiner von außen auf diese Daten zugreifen darf/soll. Bei dir mit Klasse1 und Klasse2 nutzt du dafür das Verhalten von Delphi aus, dass Klassen in einer Unit alle zueinander verhalten wie friend Klassen. Das heisst, jede Klasse in der Unit darf auch auf die private und protected Elemente der anderen Klassen von außen zugreifen.
So, das mal zur Theorie. Nun stellt sich bei deinem Problem die Frage: Warum hast du die Dinge im private Abschnitt definiert, wenn du sie doch von außen zugreifbar benötigst? Du könntest nun entweder die Daten in den Public Bereich verschieben oder mit Properties arbeiten, welche dir die Möglichkeit bieten die Private Elemente nach außen sichtbar zu machen und gleichzeitig dir alle Möglichkeiten zur Kontrolle der Zugriffe zu geben. Die Frage ist nun: wodran liegt es? Falsches Design der Klassen oder fehlendes Wissen? Um zu einer Lösung zu kommen müssten wir wissen, was du erreichen willst. Warum sind die Daten private, müssen sie private sein, wenn ja, warum musst du dann mit Klasse3 drauf zugreifen? |
Re: Strukturierungsproblem (Units, Klassen)
Zitat:
Zitat:
Zitat:
Klasse3 ist die Umgebung. In ihr wird gespeichert, wo z.B. Wände sind, gegen die die Spielbälle nicht prallen dürfen. In Klasse3 stehen die Kollisionsüberprüfungsmethoden. Um nach einer Kollision zu prüfen, muss Klasse3 die Koordinaten der Spielbälle kennen. Form1 braucht diese allerdings nicht zu kennen, deswegen sind sie im Private-Abschnitt deklariert. |
Re: Strukturierungsproblem (Units, Klassen)
Ok, folgendes:
1. Klasse 1 bekommt alles für die Bälle wichtige. Ein Ball sollte alles wichtige (ver)öffentlich(en) was ihn beschreibt. Grösse, Geschwindigkeit, Farbe, Position, etc. 2. Klasse 2 sollte eine Ableitung von einer Liste sein. Ich würde dort TObjectList oder sonst auch TList nehmen. 3. Klasse 3 bekommt alles für's Spielfeld wichtige. Klasse 3 legt intern eine Instanz von Klasse 2 an und hat damit sofort und immer Zugriff auf die Position aller Bälle, da er auf die Ballliste zugreifen kann und damit auf die Eigenschaften der eigentlichen Bälle. |
Re: Strukturierungsproblem (Units, Klassen)
Zitat:
Zitat:
Ich versuch das alles mal umzusetzen. Vielen Dank an dich! :dp: Eine Frage hab ich allerdings noch: Zitat:
|
Re: Strukturierungsproblem (Units, Klassen)
Zitat:
|
Re: Strukturierungsproblem (Units, Klassen)
Zitat:
|
Re: Strukturierungsproblem (Units, Klassen)
Zitat:
Zitat:
|
Re: Strukturierungsproblem (Units, Klassen)
Zitat:
Nur was mich daran stört, wenn das ganze Spiel über Klasse3 läuft: In Form1 wird in der Timer-procedure die Neu-Berechnen-Prozedur aus Klasse3 aufgerufen. Diese ruft die Kollisionsüberprüfung aus Klasse3 (aus der u.a. die voneinander-Abprall-Prozedur aus Klasse2 aufgerufen wird) und die Neu-Berechnen-Methoden aus Klasse2 auf. Von dort aus wird dann für jeden Ball die Neu-Berechnen-Methode aus Klasse1 aufgerufen. Kostet das nicht unnötig viel Zeit oder optimiert der Compiler das automatisch? Wenn Klasse1, 2 und 3 alle in einer Unit stünden, würde ich mir hierbei den Umweg über Klasse3 sparen. Andererseits wäre die Trennung zwischen GUI und Berechnungen dann nicht ganz so ausgeprägt vorhanden. EDIT: ich glaub, ich hab das, was ich zitiert hab, genau falsch verstanden |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz