Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Inkonsequente Vererbung oder Missverständnis (https://www.delphipraxis.net/116629-inkonsequente-vererbung-oder-missverstaendnis.html)

HeikoAdams 3. Jul 2008 09:52


Inkonsequente Vererbung oder Missverständnis
 
Hallo,
ich frage mich schon einige Zeit, warum ich Units, die ich im Ahnen mittels
Delphi-Quellcode:
uses
eingebunden habe, im Erben erneut einbinden muss. :wiejetzt:
Bislang ist mir noch kein plausibler Grund dafür eingefallen. Vielleicht kann mir ja hier jemand auf die Sprünge helfen. :glaskugel:

chaosben 3. Jul 2008 09:54

Re: Inkonsequente Vererbung oder Missverständnis
 
Frage: Was hat ein uses mit Vererbung zu tun?

Verbung betrifft imho Klassen und nicht Units.

HeikoAdams 3. Jul 2008 10:07

Re: Inkonsequente Vererbung oder Missverständnis
 
Vielleicht muss das mal ein wenig konkreter formulieren, damit mein Problem klarer erkennbar ist:

Ich erstelle mir ein Ahnen-Form, in dem ich zusätzlich die Units Math, StrUtils und DateUtils über die uses-Klausel einbinde.
Warum muss ich jetzt in jedem Erben des Forms die Units Math, StrUtils und DateUtils neu einbinden, wenn ich sie benötige??
Das ist für mich inkonsequent, weil der Ahne die Units ja schon kennt.

sirius 3. Jul 2008 10:10

Re: Inkonsequente Vererbung oder Missverständnis
 
Das hat nichts mit der Klasse zu tun, sondern mit der Unit. Und die Unit steht ganz für sich alleine da.

HeikoAdams 3. Jul 2008 10:14

Re: Inkonsequente Vererbung oder Missverständnis
 
Zitat:

Zitat von sirius
Das hat nichts mit der Klasse zu tun, sondern mit der Unit. Und die Unit steht ganz für sich alleine da.

Okay, das klingt plausibel.
Aber was würde dagegen sprechen, die im Ahnen eingebundenen Units auch für Erben zugänglich zu machen, ohne das man sie im Erben neu einbinden muss?
Ich würde da folgende Vorteile sehen:
  • Zeitersparnis, da man Units nicht x-Fach einbinden muss
  • Einfacher zu wartender Code. Wenn man z.B. die Math-Unit austauschen will, braucht man dies nur im Ahnen machen, ohne alle Erben durchsuchen zu müssen.
  • Der Code wird übersichtlicher

TeronG 3. Jul 2008 10:23

Re: Inkonsequente Vererbung oder Missverständnis
 
Wer sagt denn, daß du alle units der Ahnen besitzt? :gruebel:
Kann ja sein das du nur die .dcu hast/bekommst.
Wie soll Delphi dann darauf reagieren!? :gruebel:

HeikoAdams 3. Jul 2008 10:31

Re: Inkonsequente Vererbung oder Missverständnis
 
Zitat:

Zitat von TeronG
Wer sagt denn, daß du alle units der Ahnen besitzt? :gruebel:
Kann ja sein das du nur die .dcu hast/bekommst.

Daran hatte ich jetzt nicht gedacht. :wall:

Zitat:

Zitat von TeronG
Wie soll Delphi dann darauf reagieren!? :gruebel:

Einzige Möglichkeit wäre wohl nur, das Delphi mault "Unit XY nicht gefunden" - ob das praktikabel und sinnvoll ist, wage ich aber mal zu bezweifeln.

hoika 3. Jul 2008 10:49

Re: Inkonsequente Vererbung oder Missverständnis
 
Hallo

> Wer sagt denn, daß du alle units der Ahnen besitzt? Grübelnd... <
> Kann ja sein das du nur die .dcu hast/bekommst. <
> Wie soll Delphi dann darauf reagieren!? <

Hm ???

Was hat denn uses mit dcu/pas zu tun?

Wenn ich nur eine myunit.dcu habe, kann ich trotzdem

Delphi-Quellcode:
uses myunit;
schreiben.


wenn das nicht ginge, würden die kommerziellen Anbieter,
die ja den Quellcode nicht rausrücken wollen,
ganz schön alt aussehen.


Nun zudem uses.

Ein Punkt bei Vererbung ist, einmal im Base schreiben und den Code+Daten
dann bei der Ableitung benutzen (Wiederverwendung).


Wenn bsp-weise die unit Math in der Base-Klasse für irgendeine Berechung benutzt wird,
muss sie natülich in der abgeleiteten Klasse niht nochmal eingebunden werden.
Ausnahme: auch die abgeleitete Klasse hat (neuen Code), der die unit Math benutzt.


Heiko

Phoenix 3. Jul 2008 10:58

Re: Inkonsequente Vererbung oder Missverständnis
 
Zitat:

Zitat von hoika
wenn das nicht ginge, würden die kommerziellen Anbieter,
die ja den Quellcode nicht rausrücken wollen,
ganz schön alt aussehen.

Der Fall ist der, wenn MyUnit.pas (deren Quellcode Du nicht hast), die MySecretUnit benutzt, und die MySecretUnit.dcu nicht mit ausgeliefert wird.

Das heisst MyUnit benutzt MySecretUnit, Du leitest von einer Klasse ab die in MyUnit.dcu steckt. Nun kann aber der Inhalt von MySecretUnit (du hast weder .pas noch .dcu) nicht in der Ableitung genutzt werden. Darum gings ;-)

mkinzler 3. Jul 2008 11:04

Re: Inkonsequente Vererbung oder Missverständnis
 
Die DCU kann natürlich auch in einer BPL/DCP liegen.

hoika 3. Jul 2008 11:11

Re: Inkonsequente Vererbung oder Missverständnis
 
Hallo Phoenix,

das trifft aber nur auf Funktionen/Prozeduren zu,
bei Klassen kommt es darauf an.

Delphi-Quellcode:
in MySecretUnit.dcu
  TMySecretClass = class
    protected
      procedure Test1;
    public
      procedure Test2;
  end;

in MyUnit.dcu
  TMyUnitClass = class(TMySecretClass)
  end;

in MyUnit2.pas
  TMyUnitClass2 = class(TMyUnitClass)
jetzt klappt natürlich folgendes
Delphi-Quellcode:
var
  MyClass: TMyUnitClass2;
begin
  MyClass:= TMyUnitClass2.Create;
  MyClass.Test1;
  MyClass.Test2;

Wichtig ist natürlich, dass die Methode public oder protected ist.


Heiko

p80286 4. Jul 2008 11:02

Re: Inkonsequente Vererbung oder Missverständnis
 
Hallo zusammen,

auch ich bin der Meinung, daß die "Unit-Vererbung" inkonsequent ist.
In uralten Pascal Zeiten war es so, daß uses-Deklarationen im Interface nach "oben" durchgereicht wurden.

z.B.
Delphi-Quellcode:
UNIT Mathe
interface
  procedure Mathe1;
....

UNIT Berechnung;
interface
uses Mathe;

procedure Berechne1;
.......


UNIT MachWas;

..
implementation
uses Berechnung;

procedure machwas1;
begin
  Mathe1;
  Berechne1;
end;
Seit D5(?) funktioniert das nicht mehr, jetzt muß es so aussehen:

Delphi-Quellcode:
UNIT Mathe
interface
  procedure Mathe1;
....

UNIT Berechnung;
interface
uses Mathe;

procedure Berechne1;
.......


UNIT MachWas;

..
implementation
uses Berechnung,Mathe;

procedure Machwas1;
begin
  Mathe1;
  Berechne1;
end;
Obwohl, wenn ich mich recht erinnere, in der Online-Hilfe das "alte" Verhalten als immer noch gültig beschrieben wird.
Oder habe ich da was falsch verstanden?

Gruß
K-H

DeddyH 4. Jul 2008 11:07

Re: Inkonsequente Vererbung oder Missverständnis
 
Die OH von Delphi 5 meint:
Zitat:

Die Reihenfolge der Units in der uses-Klausel bestimmt die Reihenfolge der Initialisierung dieser Units (siehe Der initialization-Abschnitt) und wirkt sich auf die Suche des Compilers nach den Bezeichnern aus. Wenn zwei Units eine Variable, eine Konstante, einen Typ, eine Prozedur oder eine Funktion mit identischem Namen deklarieren, verwendet der Compiler die Deklaration der in der uses-Klausel zuletzt angegeben Unit. Wollen Sie auf den Bezeichner in einer anderen Unit zugreifen, müssen Sie den vollständigen Bezeichnernamen angeben: Unitname.Bezeichner.

Eine uses-Klausel muß nur die Units enthalten, die direkt vom Programm bzw. von der Unit verwendet werden, in dem bzw. der die uses-Klausel steht. Referenziert beispielsweise Unit A Konstanten, Typen, Variablen, Prozeduren oder Funktionen, die in Unit B deklariert sind, muß die Unit B explizit in der uses-Klausel von Unit A angegeben werden. Referenziert B wiederum Bezeichner aus Unit C, ist Unit A indirekt von Unit C abhängig. In diesem Fall muß Unit C nicht in einer uses-Klausel in Unit A angegeben werden. Der Compiler benötigt jedoch Zugriff auf die Units B und C, während Unit A verarbeitet wird.

Das folgende Beispiel illustriert diese indirekte Abhängigkeit:

Delphi-Quellcode:
program Prog;

uses Unit2;
const a = b;
...
unit Unit2;
interface
uses Unit1;
const b = c;
...
unit Unit1;
interface
const c = 1;
...
Hier hängt das Programm Prog direkt von Unit2 ab, die wiederum direkt von Unit1 abhängig ist. Prog ist also indirekt von Unit1 abhängig. Da Unit1 nicht in der uses-Klausel von Prog angeben ist, sind die in Unit1 deklarierten Bezeichner für Prog nicht verfügbar.
Damit ein Client-Modul compiliert werden kann, muß der Compiler Zugriff auf alle Units haben, von denen der Client direkt oder indirekt abhängt. Sofern der Quelltext dieser Units nicht geändert wurde, benötigt der Compiler nur die DCU-Dateien, nicht jedoch die Quelltextdateien (PAS).

Werden im interface-Abschnitt einer Unit Änderungen vorgenommen, müssen die von dieser Unit abhängigen Units neu compiliert werden. Werden die Änderungen dagegen nur im implementation- oder einem anderen Abschnitt einer Unit vorgenommen, müssen die abhängigen Units nicht neu compiliert werden. Der Compiler überwacht diese Abhängigkeiten und nimmt Neucompilierungen nur vor, wenn dies erforderlich ist.

p80286 4. Jul 2008 14:21

Re: Inkonsequente Vererbung oder Missverständnis
 
Danke!

Wer lesen kann ist klar im Vorteil!

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:38 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