![]() |
AW: Visitor Pattern
Zitat:
Delphi-Quellcode:
: Eine Schreibschutz-Markierung. Das erlaubt natürlich gewisse Compileroptimierungen, genauer gesagt kann einfach ein Pointer auf das Original übergeben werden, statt dass eine Kopie auf dem Stack angelegt werden muss.
const
Zu deiner 2. Frage: Das geht nicht, der Compiler schmeißt dann einen Fehler. Im Grunde ist
Delphi-Quellcode:
das gleiche wie
const
Delphi-Quellcode:
, nur mit dem Unterschied, dass das Original garantiert nicht verändert wird.
var
|
AW: Visitor Pattern
CONST ist nicht immer genau das Gleiche wie VAR,
das siehst du, wenn du z.B.
Delphi-Quellcode:
mit
const i: Integer
Delphi-Quellcode:
und
i: integer
Delphi-Quellcode:
vergleichst, denn dieses wird delphi meißt so weit optimieren, daß hier kein Pointer, sondern direkt der Wert mitgenommen wird, trots des CONST.
var i: Integer
dennoch können, vorallem bei referenzzählenden Typen oder gar dem "kranken" WideString und Records, durch das CONST dennoch so einige kleine Stellen optimiert werden, da man hier explizit angibt, daß der Wert nicht verändert wird. |
AW: Visitor Pattern
Also jetzt brauch ich doch noch mal eine genauere Erklärung.
Ich habe es gerade getestet und ich kann auf einem const Argument alles aufrufen und es auch durch nicht konstante Methoden verändern. Was heißt hier const?
Delphi-Quellcode:
type
Test = class private x : Integer; public constructor Create; procedure Konstant(); procedure NichtKonstant(); end; { Test } constructor Test.Create; begin x := 1; end; procedure Test.Konstant; begin WriteLn(IntToStr(x)); end; procedure Test.NichtKonstant; begin x := x * 2; end; procedure Foo(const t : Test); begin t.Konstant; t.NichtKonstant; t.Konstant; end; var Tester : Test; begin Tester := Test.Create; Foo(Tester); Tester.Free; ReadLn; end.
Code:
1
2 |
AW: Visitor Pattern
CONST bezieht sich immer nur auf die Variable/Parameter.
Es kann also der Parameterwert nicht verändert werden (Interface freigeben oder ein Anderes einfügen), aber den Inhalt von Objekten und Interfaces betrifft dieses nicht.
Delphi-Quellcode:
ändert ja nur den Inhalt und nicht den Parameter, bzw. den Zeiger in dem Parameter, welcher auf das Objekt zeigt.
t.NichtKonstant;
sowas geht nicht
Delphi-Quellcode:
Es gibt nur eine Stelle, wo CONST wirklich versagt ... und das ist bei Records, welche "neuerdings" mit Record-Methoden versehen werden können.
procedure Foo(const t : Test);
begin t := nil; t := WasAnderes; end; Eigentlich dürfte man bei Records, da sie nicht über einen Zeiger, sondern direkt verwalte werden, nicht den Inhalt verändern, welches aber dennoch leider über die RecordMethoden möglich ist. :cry: |
AW: Visitor Pattern
Ah ok, jetzt ists klar.
Gibt es auch ein const, das die Instanz konstant macht. So dass die Funktion das übergebene Objekt nicht verändert darf? |
AW: Visitor Pattern
Leider nein.
Für sowas müßtest du selber den Schreibschutz direkt in das Objekt/Interface einbauen. |
AW: Visitor Pattern
Schade, aber trotzdem Danke:wink:
Gibt es ein empfehlenswertes Buch, dass solche Dinge wie in diesem Thread bespricht (Patterns in Delphi, gutes Design...)? Die meisen Delphi Bücher die ich mir angesehen habe, sahen nach dem Schema "Klicken Sie Form erstellen um ein Form zu erstellen" aus. Gerne auch englisch. |
AW: Visitor Pattern
Nicht Delphi aber gut verständlich und unterhaltsam:
![]() Die Beispiele kann man auch sehr leicht in Delphi umsetzen. |
AW: Visitor Pattern
1) gibt es sowieso fast keine aktuellen Delphibücher. IMHO spricht das FÜR Delphi ;)
und b) Ich denke da sollten Bücher, die andere Sprachen zur Erklärung verwenden auch möglich sein. Sherlock |
AW: Visitor Pattern
Bücher wie GoF usw hab ich schon im Regal stehen. Ich dachte eher an etwas speziell auf Delphi bezogen. Vielleicht verschwenden Delphi Entwickler ja nicht so gern ihre Zeit mit Lesen :lol:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 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