AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verdeckte Eigenschaften verwenden

Ein Thema von Incocnito · begonnen am 6. Apr 2020 · letzter Beitrag vom 6. Apr 2020
Antwort Antwort
Incocnito

Registriert seit: 28. Nov 2016
210 Beiträge
 
#1

Verdeckte Eigenschaften verwenden

  Alt 6. Apr 2020, 12:50
Hallo Leute,

ich steht gerade auf dem Schlauch.
Ich will auf die verdeckte Eigenschaft zugreifen komme aber nicht drauf, wie das geht.

Theoretisches Beispiel:
Delphi-Quellcode:
type
  TMyClass = class(TSomeSystemClass)
  private
    Function GetSomeVal() : Boolean;
    Procedure SetSomeVal(const Value : Boolean);
  public
    SomeVal : Boolean read GetSomeVal write SetSomeVal;
  end;
  
...

Function TMyClass.GetSomeVal() : Boolean;
Begin
  Result := inherited.SomeVal; // <- Geht so nicht
  DoSomeThingMore_1();
End;

Procedure TMyClass.SetSomeVal(const Value : Boolean);
Begin
  inherited.SomeVal := Value; // <- Geht so nicht
  DoSomeThingMore_2();
End;
Ich dachte ich könnte einfach mit Inherited darauf zugreifen,
aber das ist wohl nur für den aktuellen Kontext gedacht.

Weiß jemand, wie ich die Verwendung von "SomeVal" aus der Klasse
TSomeSystemClass "verhindern" kann, so dass es nur in Verbindung
mit der Prozedur "DoSomeThingMore_X()" läuft.

Die zugrundeliegende Klasse kann/will ich ja nicht ändern.

Mit freundlichem Gruß
Incocnito
  Mit Zitat antworten Zitat
Alt 6. Apr 2020, 13:19     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Incocnito

Registriert seit: 28. Nov 2016
210 Beiträge
 
#2

AW: Verdeckte Eigenschaften verwenden

  Alt 6. Apr 2020, 13:44
Hi Frühlingsrolle!

Vielen Dank für die Hilfe.
Ironischerweise war das Lesen deines Beispiels die Hilfe zur Lösung,
auch wenn Sie nicht die eigendliche Lösung war.
Mein Fehler war einfach nur der Punkt zwischen "inherited" und "SomeVal"
in meiner "GetSomeVal"- und meiner "SetSomeVal"-Methode.
Ohne den Punkt macht er nun genau das was er soll!

Mit freundlichem Gruß
Incocnito
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Verdeckte Eigenschaften verwenden

  Alt 6. Apr 2020, 13:46
Grade das ist der Sinn von private . Statt private solltest du dann protected nehmen, wenn abgeleitete Klassen das verwenden können sollen.

Und die Getter/Setter-Methoden kannst du bewusst noch virtual machen, wenn abgeleitete Klassen sie auch überschreiben können sollen.
  Mit Zitat antworten Zitat
Alt 6. Apr 2020, 14:05     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Verdeckte Eigenschaften verwenden

  Alt 6. Apr 2020, 14:10
Hier sollte das Beispiel dennoch funktionieren, weil die Klassen in ein und derselben Unit gegeben sind.
Aber auch nur, solange die Methoden als private und nicht als strict private deklariert wurden.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
210 Beiträge
 
#5

AW: Verdeckte Eigenschaften verwenden

  Alt 6. Apr 2020, 16:22
Grade das ist der Sinn von private . Statt private solltest du dann protected nehmen, wenn abgeleitete Klassen das verwenden können sollen.

Und die Getter/Setter-Methoden kannst du bewusst noch virtual machen, wenn abgeleitete Klassen sie auch überschreiben können sollen.
Die ableitende Klasse ist von mir. Die abgeleitete Klasse (Basisklasse) ist unveränderbar.
In der Basisklasse ist das Feld public.
Wenn meine Klasse verwendet wird, sollen die Zehntausend anderen Methoden/Eigenschaften/...
genau so verwendet werden, aber wenn einer "SomeVal" ausließt oder ändert, soll immer auch noch was gemacht werden.
Ob jemand meine Klasse ableiten will ist mir dann im Zweifelsfall erstmal egal.

Hab' ich meine Ausgangsfrage echt so missverständlich geschrieben?

Wie gesagt, ich hatte nach "inherited" einen Punkt gemacht und mich gewundert,
was ich denn wohl falsch mache. Das war schon der ganze Fehler.

Liebe Grüße aus dem hohen Norden
Inocncito
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#6

AW: Verdeckte Eigenschaften verwenden

  Alt 6. Apr 2020, 16:31
Problemchen bei dieser Art des Überschreibens.

Wenn jemand als Variable TSomeSystemClass verwendet, dann greift er auf das Original zu, da deine Überdeckung nicht bekannt ist.
Die fehlerunanfällige Lösung wäre es, wenn Getter und Setter virtual sind und direkt überschrieben werden können.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
210 Beiträge
 
#7

AW: Verdeckte Eigenschaften verwenden

  Alt 6. Apr 2020, 16:43
Problemchen bei dieser Art des Überschreibens.

Wenn jemand als Variable TSomeSystemClass verwendet, dann greift er auf das Original zu, da deine Überdeckung nicht bekannt ist.
Die fehlerunanfällige Lösung wäre es, wenn Getter und Setter virtual sind und direkt überschrieben werden können.
Das ist mir zu hoch.
Wenn jemand direkt auf "TSomeSystemClass" zugreift (davon ein Objekt erstellt und damit arbeitet),
kann ich doch eh nichts mehr machen. Oder wie jetzt?

[Edit:]
Oder meinst du
Delphi-Quellcode:
...
var test : TSomeSystemClass;
begin
  test := TMyClass.Create();
  ...
[/Edit]

Liebe Grüße
Incocnito

Geändert von Incocnito ( 6. Apr 2020 um 16:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#8

AW: Verdeckte Eigenschaften verwenden

  Alt 6. Apr 2020, 16:47
Delphi-Quellcode:
var
  M: TMyClass;
  B: TSomeSystemClass;

M := TMyClass.Create;
M.SomeVal := ...; // TMyClass.SetSomeVal
TSomeSystemClass(M).SomeVal := ...; // TSomeSystemClass.SetSomeVal
S := M;
S.SomeVal := ...; // TSomeSystemClass.SetSomeVal

S := TMyClass.Create;
S.SomeVal := ...; // TSomeSystemClass.SetSomeVal
TMyClass(S).SomeVal := ...; // TMyClass.SetSomeVal
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
210 Beiträge
 
#9

AW: Verdeckte Eigenschaften verwenden

  Alt 6. Apr 2020, 16:55
Delphi-Quellcode:
var
  M: TMyClass;
  B: TSomeSystemClass;

M := TMyClass.Create;
M.SomeVal := ...; // TMyClass.SetSomeVal
TSomeSystemClass(M).SomeVal := ...; // TSomeSystemClass.SetSomeVal
S := M;
S.SomeVal := ...; // TSomeSystemClass.SetSomeVal

S := TMyClass.Create;
S.SomeVal := ...; // TSomeSystemClass.SetSomeVal
TMyClass(S).SomeVal := ...; // TMyClass.SetSomeVal
Ich sehe das gelassen. Es sollte keinen Grund geben meine Klasse zu Casten.
Und wenn es doch einer tut muss er damit leben, dass die Aufrufe dann genau so
funktionieren, wie von der Oberklasse vorgesehen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#10

AW: Verdeckte Eigenschaften verwenden

  Alt 6. Apr 2020, 17:25
Casten ist garnicht nötig. (siehe jeweils die ersten zwei Zeilen, ab/inkl. dem Create)

Ist wie beim TStringList.
Man kann hier überall TStrings für seine Variablen und Parameter verwenden, ohne dass es Probleme bereitet, falls man nicht auf was Spezielles von TSTringList zugreifen muss.

Wie gesagt, bei solches Arten des Überdeckens muß man dann damit rechnen, dass es gegenüber einem Überschreiben (Override) eventuell ein paar Aussetzer geben kann, wenn nicht der "genaue" Typ verwendet wird.


Muß man sicher stellen, dass sein Code "immer" ausgeführt wird, denn geht kein Weg um OVERRITE drumrum,
oder man baut z.B. Fallstricke für den Compiler ein, indem man die OOP missachtet (etwas versteckt was mal sichtbar war)
und seine Funktion unter einem anderen Namen veröffentlicht, damit es knallt, wenn jemand den falschen Typen benutzt.

Delphi-Quellcode:
type
  TMyClass = class(TSomeSystemClass)
  private
    Function GetSomeVal() : Boolean;
    Procedure SetSomeVal(const Value : Boolean);
  protected
    SomeVal; // hier wird der Compiler sich zurecht beschweren, aber diese "Warnung" kann man ignorieren oder deaktivieren.
  public
    SomeVal2 : Boolean read GetSomeVal write SetSomeVal;
  end;
Über den OriginalTyp kann immernoch das alte SomeVal aufgerufen werden, aber ausversehn SomeVal2 über den alten Typ zu benutzen ist nicht möglich, womit man somit darauf hingewiesen wird, dass etwas nicht stimmt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz