![]() |
AW: Meine Probleme mit Delphi-OOP ...
Liste der Anhänge anzeigen (Anzahl: 1)
Praktisch gesehn, werden diese globalen Form-Variablen garnicht benötigt, welche Delphi standardmäßig anlegt.
Ich würde mir wünschen, wenn es dieses CreateForm auch ohne diesen Var-Parameter geben würde. Aber mit einer temporären Variable in der DPR, könnte man dieses auch lösen. Vorallem in einem Programm mit nur einem automatisch erstellten Form, gibt es IMHO absolut keine Daseinsberechtigung für diese Variable und ohne diese gäbe es viele (Anfänger)Probleme ganicht erst. PS: Das angehängteDemoprojekt enthält einen Fehler, wie es genau so schon vorgekommen ist, bei einem Anfänger/Schüler, letztes Jahr hier in der DP. Und er zeigt ein großes Problem, welches mit globalen Variablen auftreten kann, wenn sie nicht eindeutig verwendet, sondern mehrmals und/oder an mehreren Stellen genutzt werden. Ach ja, ich suche noch eine einfache Demo, für eine globale Zählvariable, welche in mehreren Funktionen genutzt werden und sich so gegenseitig beeinflussen, was mit lokalen Schleifenvariablen nicht passieren würde. Falls jemand was kennt.... (mit ist der Thread aus'm letzten/vorletzen Jahr nicht wieder eingefallen, wo sowas mal aufgetreten ist) |
AW: Meine Probleme mit Delphi-OOP ...
Zitat:
![]() :wink: |
AW: Meine Probleme mit Delphi-OOP ...
Vielleicht hilft das hier weiter:
![]() |
AW: Meine Probleme mit Delphi-OOP ...
Hallo,
Zitat:
Delphi-Quellcode:
Kommt aber trotzdem die Warnung:
TTest5= class(TTest1)
procedure Test; overload; override; procedure Test(const A: Integer); overload; end;
Code:
[DCC Warnung] MethodTracerUnit1.pas(32): W1010 Methode 'Test' verbirgt virtuelle Methode vom Basistyp 'TTest1'
Zitat:
Code:
In Delphi ist jede normale Funktion, Prozedur, Methode nicht überladbar. Will man überladen muss man bei jeder Version ein overload mit angeben. Folgendes geht deswegen so nicht:
void Test;
void Test(int A);
Delphi-Quellcode:
Der Kompilier wirft da einen Fehler. Auch so:
procedure Test;
procedure Test(const A: Integer);
Delphi-Quellcode:
und so gibt es einen Fehler:
procedure Test;
procedure Test(const A: Integer); overload;
Delphi-Quellcode:
Erst so funktioniert das Überladen:
procedure Test; overload;
procedure Test(const A: Integer);
Delphi-Quellcode:
Und weil das auch bei Vererbung so ist, braucht man für jede andere Version des Create-Constructors bei Komponenten ein
procedure Test; overload;
procedure Test(const A: Integer); overload;
Delphi-Quellcode:
.
reintroduce;
Zitat:
Zitat:
Delphi-Quellcode:
Das Test von TTestB verdeckt das Test von TTestA. Sprich folgendes lässt sich nicht kompilieren:
TTestA= class
procedure Test; end; TTestB= class(TTestA) procedure Test(A:Integer); end;
Delphi-Quellcode:
Die Fehlermeldung wäre:
...
B: TTestB ... B.Test; ...
Code:
einbeliebigername.
[DCC Fehler] MethodTracerUnit1.pas(119): E2035 Nicht genügend wirkliche Parameter
|
AW: Meine Probleme mit Delphi-OOP ...
Zitat:
Was ich aber dennoch nicht ganz verstehe, weshalb eine feste Definition innerhalb einer Sprache nicht einfach hingenommen werden kann. Es gibt ja auch noch die Unterschiede bei div zwischen C++ und Delphi, wobei ich in dieser Hinsicht sagen muss, dass mir Delphi da besser gefällt. Auch dass es bei Delphi in der Grundeinstellung keine Header-Dateien gibt wie in C++ wurd enicht bemängelt, obwohl man dann von ganz unten bis nach ganz oben scrollen mus, anstatt einfach in den Header zu sehen wenn man Variablen oder Deklarartionen nochmals bearbeiten möchte. |
AW: Meine Probleme mit Delphi-OOP ...
overload = überladen
override = überschreiben überladen = gleichzeitig mehrere Methoden mit gleichem Namen, bzw. alte aus Vorfahren Methode nicht verdecken. (absichtliches Verdecken wird mit reintroduce angeben) überschreiben = virtuelle (virtual) oder dynamische (dynamic) Methode des Vorfahren überschreiben, also den Eintrag in der VMT ändern. scrollen ... dafür ibt es Listen und Tastenkürzel, im schnell hin- und herzuspringen, wie z.B. Strg+Shift+Hoch oder +Runter |
AW: Meine Probleme mit Delphi-OOP ...
@himitsu: Ist dies eine allgemeingültige Definition und somit auch auf Delphi übertragbar? Ich wäre jetzt sehr dankbar, wenn Du mir erklären würdest, warum der Delphi-Compiler dies anscheinend anders sieht.
Abgesehen davon, wenn man mit reintroduce absichtlich eine Methode überdeckt, aber mit inherited dafür sorgt, dass die originale Methode dennoch ausgeführt wird, was soll daran so schlimm sein? Ich verstehe eben nach wie vor nicht, wen es gewisse Regeln zu geben scheint, an die man sich einfach zu halten hat, warum es so schwer ist genau dies zu tun? Ich möchte hier niemandem mit dem Finger drohen, wie es anscheinend rüberkommt. Denke aber immer daran, dass die ursprüngliche Definition der OOP zugunsten der Praktikabilität nicht vollkommen umgesetzt wurde (z.B. bei der Polymorphie). Zitat:
|
AW: Meine Probleme mit Delphi-OOP ...
Wegen den anderen fragen schau ich dann nochmal nach.
Aber reintroduce schaltet eigentlich nur die Compilerwarnung ab. Wenn man eine Methode verdeckt, dann wird man vom Compiler gewarnt. Und hat man absichtlich verdeckt, dann kann man das über reintroduce auch so markieren und weg ist die Warnung. Ob die verdeckte Methode intern dann via inherited oder sonstwie aufberufen wird, ist dabei unwichtig. Das Verdecken bezieht sich nur auf die äußere Schnittstelle, also das Interface (Deklaration) und nicht die Implementation (Code). |
AW: Meine Probleme mit Delphi-OOP ...
@himitsu: Besten Dank, wird notiert. Vielleicht nehme ich auch viel zu viel einfach als gegeben hin.
|
AW: Meine Probleme mit Delphi-OOP ...
Zitat:
Overload, Override ist zumindestens in Delphi/Pascal so umgesetzt. Virtual und Override ist so: Gibt man in einer Klasse virtual für eine Methode an, dann wird dafür, in/ab diesem Typ ein Eintrag in der VMT angelegt. Wenn man jetzt eine Variable mit diesem Typ anlegt, dann kennt dieser Typ seine VMT. Nun könnte man in einer Variable auch einen Nachfahren dieses Typen abspeichern. Ist in dem abgeleiteten Typen diese Methode überschrieben, dann wird das in der VMT vermerkt. Damit kennt dann auch der Vorfahr den Zeiger zur neuen Methode, da es ja in der VMT drinsteht. Wurde diese Methode aber nur verdeckt (egal ob sie Virtual ist oder nicht), dann kennt der Vorfahr diesen Zeiger nicht und kann damit immer nur seine Methode aufrufen. Aus diesem Grund sind alle VCL-Komponenten von TComponent abgeleitet, wo vorallem der Constructor virtuell ist, sowie bei allen Klassen der Destructor virtual ist. Auf diese Weise kann die VCL den richtigen Constructor laden und auch immer der richtige Destructor ausgeführt werden, da der Vorfahre diese kennt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:58 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 by Thomas Breitkreuz