erstens: ja, aber nicht so wie in c. In Delphi sind alle Klassen automatisch friend, wenn sie in der selben Unit deklariert werden und können sich gegenseitig bis in die Private Abschnitte einsehen. Gesonderte Deklarationen sind hier nicht nötig.
zweitens: ich glaube, du suchst den As Operator:
Code:
(Sender As TButton).Caption:=blasülz;
Man sollte allerdings immer vorher fragen, ob es eine Instanz des Zieltyps ist. Das geht mit 'Is':
Code:
If Sender Is TButton Then...
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Die Kombination von IS und AS halte ich persönlich für nicht gut. Im AS Operator passiert nichts anderes als, dass IS aufgerufen wird und im nicht zutreffenden Teil eine Excception ausgelöst wird. Wenn man jetzt bedenkt, dass IS sich von der aktuellen Klasse die komplette Vererbung hochhangeln muss um herrauszufinden ob ein Objekt von einer Klasse stammt, dann wird man sehen, dass dabei ein Doppelt gemoppeltes Abprüfen unnötig ist.
Die typische Kombination ist eigentlich immer. IS und dann ein Cast direkt auf die Klasse
Code:
if Sender is TButton
then TButton(Sender).Irgendwas...
oder eben AS als Standalone, wenn man im Fehlerfalle eine Exception provozieren möchte.
zum Ersten: Du kannst deine Klassen ja auch über eine normale Schnittstelle ansteuern. Ich persönlich finde es nicht gut, dass in einer Unit man auf alles zugriff hat. Das verleitet dazu eine Schnittstelle zu machen die irgendwo beschränkt ist und nur intern benutzt werden kann. Eine sinnvolle Klassenstruktur zeichnet sich aber dadurch aus, dass die Klassen flexibel arbeiten und flexibel konfigurierbar sind.
Habe in einer Bibliothek mal gesehen, dass der jenige HackKlassen gemacht hat in denen Propertys/Methoden sichtbarer waren als sie eigentlich waren und hat direkt gecastet. So konnte er letzten Endes trotzdem drauf zugreifen. Ähnlich beknackte Sachen habe ich neulich in den Quellen der VCL auch gesehen.
In Delphi gibt es aber keine Möglichkeit eine Klasse zu bevorzugen außer sie in die selbe Unit zu packen. Sonst solltest du noch mal stark deine Schnittstelle überdenken.
Du kannst deine Klassen ja auch über eine normale Schnittstelle ansteuern.
Wie meinst du das? In der Unit der Klasse einfach noch die benötigten Funktionen, welche nicht Methoden sein sollen in diesem Fall, definieren? Wenn du das meinst, jo auch ein Ansatz, werd ich mal drüber grübeln was sich besser anbietet, weil
Lossy eX hat geschrieben:
ich persönlich finde es nicht gut, dass in einer Unit man auf alles zugriff hat
das gefällt mir auch nicht so. Daher meine Frage weiter oben, ob es noch was anderes gibt.
Grobabriss was ich machen will: ich brauch ein Kollisionstest für meine grafischen Objekte. Da es sinnlos ist jetzt für jedes Objekt nen eigenen Kollsionstest zu schreiben, will ich mir 3 (evtl. 4 neue Grundobjekte) nur für die Kollision machen: Linie, Dreieck und später evtl. für Octree oder ähnliches eine Kugel (und das evtl. 4 nen Quader, wäre also die BoundingBox).
Bin noch in der Konzeptphase und eine Idee ist, eine abstraktes Basisobjekt einzuführen mit einer abstrakten Methode, welche sich selber als Parameter für einen Kollisionstest hat. In den konkreten Klassen muss ich dann natürlich testen, was genau nun geprüft werden soll, daher die Frage nach dem Typ-Test.
Eine konzeptionelle Frage hätt ich da mal, wie man sowas am besten in Delphi macht( ich bin ja eher aus der C++ Welt). Das hängt auch mit meiner Frage zu friend-Funktionen zusammen.
Alle Punkt meiner grafischen Objkete werden jeweils in einer Instanz meiner Klasse TPoint gespeichert. Um für den Kollisionstest nicht alles nochmal speichern zu müssen, verlangen die Objekte einfach nur Referenzen auf existierende Punkte. Sozusagen ist das ein "Kollisionswrapper" um Eckpunkte.
Wenn ich nun mit einem anderen Objekt teste, z.B. Linie gegen Dreieck, muss ich ja Zugriff auf die Punkte um die Daten lesen zu können.
Nur wenn ich jetzt ne Property mit read mache ist das doch sinnlos bei dem Klassenmodell in Delphi. Weil der schützt damit ja nur die Adresse in der Referenzvariable, das Objekt, worauf die Referenz verweist, ist veränderbar. In C++ würd ich const benutzen, was macht man da in Delphi?
Eine andere Idee ist, das Zeug eh public zu machen, weils nur ein Wrapper ist für nen Kollisionstest. Beim ersten mal denken, sagt man sofort "nein", widerspricht ja dem Klassenmodell, Daten haben private zu sein. Aber ersten würde es durch das read ja eh ausgeheblt werden und zweites: es ist halt nur ein Wrapper, die Daten gehören ja nicht wirklich der Wrapperklassen, sie benutzt sie nur. Und das Kollisionsobjekt würde ja nur im grafischen Objekt erstellt werden, sodass die Daten nicht nach außen dringen. So gesehen könnte man die Daten ja doch public machen.
Oder halt mein erster Gedankenansatz: damit Linie an Dreieck rankommt, brauch ich sowas wie ne friend-Deklaration in C++
Soar falls einer Langeweile hat, kann er mir ja seine Meinung dazu posten.
edit: ach ja hab das Danke für die bisherigen Antworten vergessen
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Öhm... Const gibts in Delphi auch. In der Hilfe zu finden unter "Konstantenparameter"
Das const in Delphi hat aber eine etwas andere Bedeutung, also zumindest habe ich das dazu gelesen:
Delphi-Hilfe hat geschrieben:
Ein Konstantenparameter (const) entspricht einer lokalen bzw. schreibgeschützten Variablen. Konstantenparameter entsprechen weitgehend Wertparametern. Sie können ihnen jedoch im Rumpf einer Prozedur oder Funktion keinen Wert zuweisen und sie nicht als var-Parameter an eine andere Routine übergeben. Übergeben Sie eine Objektreferenz als Konstantenparameter, können Sie weiterhin auf die Objekteigenschaften zugreifen und diese ändern.
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Richtig. Das Const bei Parametern schützt nur die Variable vor dem Überschreibungstot. Bei Const wird Intern die Adresse der übergebenen Variable übergeben. Zum Beispiel entweder direkt die Variable oder die Adresse eines Records.
Pellaeon: Ist das eigentlich ein Framework oder eher nur ein Privater Code. Wenn es nur Privat ist dann spielt das mit Sicherheit auch keine Große rolle. Außerdem bin ich eh immer dafür selbst dem Entwickler so viel wie Möglich an die Hand zu geben. Etwas extrem zu beschränken finde ich nie so gut, da dadurch immer nur Nachteile entstehen. Das war ja auch einer der Gründe warum ich selber nen Texturenloader geschrieben habe.
Aber sonst muss ich gestehen, dass ich das Prinzip was du vor hast nicht so richtig verstanden habe. Wenn ich ehrlich bin.
Das ist privater Code, aber für meinen Nebenjob(so als armer Student freut man sich ja über ein extra Taschengeld )
Aber momentan neig ich dazu, das public zu machen, sozusagen die Kollisionsklassen nur als "Rechenhülle" für meine Punkte zu sehen.
THX für die Tipps
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Naja. Bei "privatem" Code sollte das nicht so tragisch sein. Aber snst kann man da wohl nur wirklich etwas sinnvolles vorschlagen wenn man die komplette Struktur in deiner Anwendung kennen würde. Aber auch das wären persönliche Meinungen und wir müssten damit ja nicht leben. Ich denke mal du hast verstanden was ich meine.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn man zuviel erlaubt, öffnet man dirty Programming alle Türen. Und am ende hat man nen riesen Fitz verzapft. Wer sich selbst etwas kasteit wird schon merken, wo er früher was anders geplant hatte. Wenn gar nicht geht, kann man den Code dann immer noch lockern, aber prinzipiell würde ich ihn erstmal strengst Möglich machen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.