![]() |
[OOP] Variable des Vorfahren ersetzen.
Hallo,
ich habe eine abstrakte Klasse, die in etwa so aussiehst:
Delphi-Quellcode:
Davon habe ich eine Klasse abgeleitet, in der das Ursprüngliche verhalten beibehalten wird, aber die Größe des Arrays fest ist.
TMyClass = class abstract(TInterfacedObject)
private myarray:Array of Integer; public procedure tuwas; end; Deklariere ich die Variable einfach neu:
Delphi-Quellcode:
dann wird in "tuwas" immer nur auf die Variablen von TMyClass zugegriffen, die logischerweise leer ist. Ist es irgendwie möglich das gewünschte Verhalten zu bekommen?
TNewClass = class(TMyClass)
private myarray:Array[0..5] of Integer; end; Wichtig ist, dass das nur durch Änderungen im Interface der Funktion passiert. Vielen Dank und Viele Grüße, Benjamin |
Re: [OOP] Variable des Vorfahren ersetzen.
Das was du vor hast "tut man nicht" bzw. es ist ein Zeichen, dass da etwas faul ist.
Eine abgeleitete Klasse darf nicht Variablen des Vorfahren ersetzen. Es gibt in deinem Fall auch gar keinen Grund myarray durch etwas anderes zu ersetzen. Wenn du die max. Anzahl der Werte in myarray begrenzen willst, dann gibt es auch andere Wege. Z.B. könntest du den direkten Zugriff auf myarray verbieten und stattdessen Methoden einführen, die den Zugriff regeln und eine Obergrenze der Elemente durchsetzen. Oder zu legst die Grösse des Arrays im Konstruktor fest:
Delphi-Quellcode:
TMyClass = class abstract(TInterfacedObject)
private myarray:Array of Integer; protected procedure InitMyArray(size:Integer); public procedure tuwas; end; TNewClass = class(TMyClass) public constructor Create; end; procedure TMyClass.InitMyArray(size:Integer); begin SetLength(myarray, size); end; constructor TNewClass.Create; begin inherited; InitMyArray(6); end; |
Re: [OOP] Variable des Vorfahren ersetzen.
Was einmal deklariert iast, läßt sich nicht mehr ändern.
Denn der Code, welcher theoretisch in de Basisklasse diese Variable nutzt, müßte sich ja auch ändern, wenn du diese Variablendeklaration änderst, was er aber nicht macht bzw. nicht machen kann. du müßtest also in der Basis nur die Zugriffspunkte definieren und in der Ableitung diese dann auf deine "neue" Variable umleiten.
Delphi-Quellcode:
TMyClass = class abstract(TInterfacedObject)
private function GetMyArray(Index: Integer): Integer; virtual; abstact; procedure SetMyArray(Index, Value: Integer); virtual; abstact; property MyArray[Index: Integer]: Integer read GetMyArray write SetMyArray; public procedure tuwas; virtual; abstact; end; TNewClass = class(TMyClass) private FMyArray: Array[0..5] of Integer; function GetMyArray(Index: Integer): Integer; override; procedure SetMyArray(Index, Value: Integer); override; public procedure tuwas; override; end; |
Re: [OOP] Variable des Vorfahren ersetzen.
Mh, gibt es irgendeine Möglichkeit eine Variable als abstract zu deklarieren?
Ansonsten muss ich den Array wohl im Constructor initialisieren. |
Re: [OOP] Variable des Vorfahren ersetzen.
Zitat:
Abstract geht nicht, aber man kann einen Pointer stattdessen definieren und dann diesen auf die gewünschte Struktur zeigen lassen. |
Re: [OOP] Variable des Vorfahren ersetzen.
Zitat:
Keine Ahnung, was du vor hast, aber es gibt auch Objekte, die sich im Prinzip wie ein Array ansprechen lassen. Ein TList-Objekt kann z.B. ganz unterschiedliche Dinge enthalten. Liste und Array sind wie zwei Seiten der gleichen Medaille. |
Re: [OOP] Variable des Vorfahren ersetzen.
Ok, vielen Dank.
Dann löse ich es mit dem Initialisieren im Konstruktor, bzw. lege in der Basisklasse eine abstrakte Methode an, die im Konstruktor aufgerufen wird und die ich im Nachfahre implementiere. Viele Grüße, Benjamin |
Re: [OOP] Variable des Vorfahren ersetzen.
Zitat:
Evtl. wäre eine Möglichkeit die Methode virtuell zu machen um von Polymorphie gebrauch zu machen. Ich bin mir zwar nicht 100% sicher, aber ich meine dass eine polymorphe Methode im Klassenkontext ihrer höchten Implementierung steht, und somit die in dieser Klasse gemachte Verdeckung nutzen müsste. Ist einer zum ausprobieren :) |
Re: [OOP] Variable des Vorfahren ersetzen.
verdecken <> ändern
ermöchte ja nicht im Nachkommen eine gleichnamige Variable haben, sondern auch, daß die Basisklasse diese Variable verwendet. PS: sowas macht TStrings und TStream Diese haben keinen eigenen Speicher, sondern nur virtuelle Schnittstellenfunktionen zu den Speichern-/Lesenfunktionen ... die Nachkommen überschreiben diese Funktionen und geben so Zugriff auf ihren Speicher. |
Re: [OOP] Variable des Vorfahren ersetzen.
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 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