geerbter Konstruktor

Diskutiere geerbter Konstruktor im Developer Network Forum im Bereich Hardware & Software Forum; Sprache: Delphi Plattform: Win32 Entwicklungsumgebung: BDS 2005 Personal Klassendeklaration (vereinfacht): type TGame = class public...
  • geerbter Konstruktor Beitrag #1
Data

Data

Bekanntes Mitglied
Dabei seit
01.04.2006
Beiträge
399
Reaktionspunkte
0
Sprache: Delphi
Plattform: Win32
Entwicklungsumgebung: BDS 2005 Personal

Klassendeklaration (vereinfacht):
Code:
[B]type[/B]
  TGame = [B]class[/B]
  [B]public[/B]
    [B]constructor[/B] Create([B]const[/B] S: [B]string[/B]);
  [B]end[/B];
  TPlayDice = [B]class[/B](TGame)
  [B]public[/B]
    [B]constructor[/B] Create;
  [B]end[/B];

Objektdeklaration:
Code:
[B]var[/B]
  Player: TGame;

Instanziierung (vereinfacht):

Code:
Player := TPlayDice.Create;

Theoretisch müsste ja jetzt der Konstruktor von TGame aufgerufen werden.
Es wird aber der Konstruktor von TPlayDice aufgerufen. Wenn ich den erforderlichen Parameter S angeben will, endet dies mit einer Fehlermeldung.
 
  • geerbter Konstruktor Beitrag #2
Data

Data

Bekanntes Mitglied
Dabei seit
01.04.2006
Beiträge
399
Reaktionspunkte
0
Ach, manchmal vergisst man wirklich die einfachsten Dinge. Die Konstruktorendeklarationen sind ja nicht identisch.
Thread kann geschlossen werden.
 
  • geerbter Konstruktor Beitrag #3
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Du hast außerdem das Ableiten vergessen, also die "virtual"-Deklaration in der Basisklasse und die "override"-Direktive in der abgeleiteten Klasse. Machst Du das nicht, bekommst Du eine Meldung, daß die Prozedur neu deklariert wurde. Wenn Du das aber wirklich irgendwann willst, dann gehört das Schlüsselwort "reintroduce" dahinter.
 
  • geerbter Konstruktor Beitrag #4
Data

Data

Bekanntes Mitglied
Dabei seit
01.04.2006
Beiträge
399
Reaktionspunkte
0
Du hast außerdem das Ableiten vergessen, also die "virtual"-Deklaration in der Basisklasse und die "override"-Direktive in der abgeleiteten Klasse. Machst Du das nicht, bekommst Du eine Meldung, daß die Prozedur neu deklariert wurde.
Aber das trifft nur zu, wenn die Deklarationen der ableitenden und abgeleiteten Klasse übereinstimmen, was ja hier nicht der Fall ist, nicht wahr?
Wenn Du das aber wirklich irgendwann willst, dann gehört das Schlüsselwort "reintroduce" dahinter.
reintroduce ist laut Dokumentation optional anzugeben, wenn man die Warnung des Compilers unterdrücken möchte.
Mit virtuellen, überschreibenden und abstrakten Methoden dürfte ich keine Probleme mehr haben, da ich diese erfolgreich mithilfe der Dokumentation implementieren konnte. Also, die Polymorphie beherrsche ich doch nun hoffentlich.
Aber manchmal übersieht man eben einfache Regeln vor lauter Eifer. ;)
 
Zuletzt bearbeitet:
  • geerbter Konstruktor Beitrag #5
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
reintroduce ist laut Dokumentation optional anzugeben, wenn man die Warnung des Compilers unterdrücken möchte.
Sicher, aber ich stehe auf dem Standpunkt, daß ALLE Hinweise und Warnungen zu behandeln sind. Schließlich ist da irgendwas komisch am Quellcode und damit anfällig für Fehler.
 
  • geerbter Konstruktor Beitrag #6
Data

Data

Bekanntes Mitglied
Dabei seit
01.04.2006
Beiträge
399
Reaktionspunkte
0
Sicher, aber ich stehe auf dem Standpunkt, daß ALLE Hinweise und Warnungen zu behandeln sind. Schließlich ist da irgendwas komisch am Quellcode und damit anfällig für Fehler.
Ja, deinen Standpunkt verstehe ich. Wäre ich in einer solchen Situation, hätte ich reintroduce sehr wahrscheinlich auch angewendet. Deine Erklärung von vorhin klang nur eben so, als müsste man reintroduce schreiben und deswegen war ich ein wenig verwirrt gewesen. ;)
 
  • geerbter Konstruktor Beitrag #7
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Bei mir muß man das schon. ;) Ich habe die Regel "keine Warnungen/Hinweise" bei uns in der Firma durchgesetzt. Aber wir kommen leicht vom Thema ab...

Aber wenn wir schon beim Erstellen von Klassen sind, hier noch ein kleiner Tip: Auch wenn man die ganzen Methoden in beliebiger Reihenfolge deklarieren kann, empfiehlt sich die alphabetische Ordnung. Die Deklarations-Anordnung ist nämlich diejenige, die einem bei der Code-Hilfe (also [Ctrl+Space]) angeboten bekommt. Da suchen sich die Methoden doch viel einfacher, wenn sie alphabetisch gelistet werden.
 
  • geerbter Konstruktor Beitrag #8
Data

Data

Bekanntes Mitglied
Dabei seit
01.04.2006
Beiträge
399
Reaktionspunkte
0
Auch wenn man die ganzen Methoden in beliebiger Reihenfolge deklarieren kann, empfiehlt sich die alphabetische Ordnung.
Tja, da kann ich auch noch was erzählen:
Zuerst habe ich die Methoden nach Zusammengehörigkeit deklariert (Gruppierungen). Als ich dann aus diversen Gründen eine Neuordnung der Klassen durchführen musste, habe ich sie dann alphabetisch angeordnet, was sich dann auch in der von dir angesprochenen Codehilfe gleich formschöner und als einfach zu behandeln bemerkbar machte.
Tja, wo ich noch nicht so durchsehe, sind Interfaces. Soviel ich weiß, gibt es da keine Felder sondern nur Methoden, die nur von Klassen implementiert werden können. Dazu müssen die drei Standardmethoden noch deklariert werden. Und dann ja noch die GUIDs. Und Klassenreferenzen... Es gibt ja soviel, was man noch nicht weiß. :confused: Da hilft wohl nur fleißig Dokumentation lesen, bis man es irgendwann versteht. :ja: Aber zum Glück gibt es ja noch die Foren. :)
 
Thema:

geerbter Konstruktor

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben