AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Operator Overloading for CLASSES (not records!)

Operator Overloading for CLASSES (not records!)

Ein Thema von TheSledgeHammer · begonnen am 23. Jan 2020 · letzter Beitrag vom 24. Jan 2020
Antwort Antwort
Seite 1 von 3  1 23   
TheSledgeHammer

Registriert seit: 22. Mai 2019
Ort: Mulfingen
43 Beiträge
 
Delphi 10.3 Rio
 
#1

Operator Overloading for CLASSES (not records!)

  Alt 23. Jan 2020, 13:49
Delphi-Version: 10.3 Rio
Hallo Community,

zunächst mal: ja, der Titel ist absichtlich in Englisch, damit ihn Leute auch finden, wenn sie in Google englische Begriffe eingeben.

Zur Sache: Laut der aktuellsten Doku von Emba (Stand 23.01.2020) bzgl. der Überladung von Operatoren steht ganz klar im Text geschrieben, dass dieses Feature ausdrücklich auch für Klassen verwendbar wäre und nicht nur für Records:
http://docwiki.embarcadero.com/RADSt...#Codebeispiele

Ihr könnt es euch denken: der Konjunktiv steht da nicht umsonst. So, wie es dort beschrieben ist, geht es natürlich nicht - wäre auch zu schön gewesen, aber warum überrascht mich das nicht?
Es hat mich schon stutzig gemacht, dass die Codebeispiele nur für Records geschrieben sind, aber man glaubt ja als naiver Entwickler zunächst mal das, was in der Doku geschrieben steht...

Ein "Glück" - und deshalb formuliere ich ja diesen Beitrag auch - haben schlaue Leute eine Alternative gefunden. Diese wurde auch schon hier in den "Delphi-News aus aller Welt" verlinkt, allerdings ist dort der Link defekt.
(https://www.delphipraxis.net/194454-...B7-github.html)
Daher habe ich hier mal den Link nochmal heraus gesucht: https://gist.github.com/lynatan/886e...dd89ed42ab2214

Jetzt sieht es aber so aus, dass diese Alternative nicht so ganz klappt, zumindest nicht für den Equal-Operator. Hat beim Thema "operator overloading" bei Klassen jemand Erfahrung, die mir/uns da weiterhelfen kann?
Tobias

Geändert von TheSledgeHammer (23. Jan 2020 um 14:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Operator Overloading for CLASSES (not records!)

  Alt 23. Jan 2020, 14:21
Ich habe mich vor einiger Zeit mit einem verwandten Thema beschäftigt. Deshalb finde ich das hier grad sehr interessant. Aber für Unwissende: Was bitte ist denn ein Non-ARC-Compiler?
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#3

AW: Operator Overloading for CLASSES (not records!)

  Alt 23. Jan 2020, 14:41
Hallo,

Was bitte ist denn ein Non-ARC-Compiler?
ARC= Automatic Reference Counting -> Ein Compiler ohne automatischer Referenzzählung. Der Win32/64 Delphi-Compiler oder die .Net-Compiler. Bei den anderen Delphi-Compilern will Embarcadero ja wieder weg vom ARC. Ich hätte gern ein Mix aus ARC/Non-ARC.
Mit freundlichen Grüßen, einbeliebigername.
  Mit Zitat antworten Zitat
TheSledgeHammer

Registriert seit: 22. Mai 2019
Ort: Mulfingen
43 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Operator Overloading for CLASSES (not records!)

  Alt 23. Jan 2020, 14:50
Ich habe mich vor einiger Zeit mit einem verwandten Thema beschäftigt. Deshalb finde ich das hier grad sehr interessant.
Sehr schöner Artikel! Aber auch hier: nur für Records.

Ich hab auch noch irgendwo beim Herumstöbern eine Erklärung gefunden, warum bisher kein operator overloading für Klassen implementiert wurde; hatte irgendwas mit dem Garbage Collector (GC) zu tun. Erklärt wurde das so, dass für jedes Mal, wo ein Operator ausgeführt wird, eine weitere Instanz der Klasse erzeugt werden müsste. Und die wird nur intern erzeugt, aber nicht freigegben und da es mit dem GC in Delphi ja nun etwas schwierig ist, würde diese Instanz als MemLeak weiter sein einsames Dasein fristen. So ganz steig ich da auch nicht durch.

Aber das kann ich irgendwie nicht so recht glauben, dass man das mittlerweile nicht irgendwie gebacken bekommt. Ich sag's mal so: andere Programmiersprachen können's doch auch!? Und offenbar hat man das für iOS im Jahr 2013 schon umgesetzt, dann sollte man doch bis ins Jahr 2019 auch irgendwie für nicht-iOS-Systeme eine Lösung parat haben! Fehlender GC hin oder her...

Und besonders lustig wird's dann, wenn in der Doku geschrieben steht, dass es gehen sollte.
Tobias

Geändert von TheSledgeHammer (23. Jan 2020 um 15:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.926 Beiträge
 
Delphi 12 Athens
 
#5

AW: Operator Overloading for CLASSES (not records!)

  Alt 23. Jan 2020, 15:20
Und besonders lustig wird's dann, wenn in der Doku geschrieben steht, dass es gehen sollte.
Weil es für die ARC-Compiler ja geht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Operator Overloading for CLASSES (not records!)

  Alt 23. Jan 2020, 15:29
hatte irgendwas mit dem Garbage Collector (GC) zu tun
ARC = einfache billigversion eines komplexen Garbage Collectors

Mit ARC werden Objekte (TObject usw.) wie Interfaces behandelt, also automatisch freigegeben, wenn alle Variablen weg sind. (dafür wird Free einfach so still und heimlich ignoriert)

Die ClassOperators benötigen aber eine automatische Speicherverwaltung, da der Entwickler (Du) das hier nicht selbst macht, bzw. oft garnicht machen kann. (Free aufrufen, wenn nicht mehr benötigt)


Ich hätte gern ein Mix aus ARC/Non-ARC.
Ich hätte auch gern [WeakRef] im Non-ARC-Compiler für interface-Variablen.
Und dass der Compiler unbekannte Attribute nicht einfach so still und heimlich ignoriert. (da wenigstens eine Warnung anzeigt)

Für Records wäre auch ein ClassOperator für New, Copy und Dispose praktisch, damit man dort z.B. auch Pointer und Objekte selbst behandeln kann, die im Record stecken.
Hatte da vor vielen Jahren mal einen QC geschrieben, sogar mit Lösung was wo wie nötig wäre (wenige Codezeilen zu ändern), aber .... ich warte immernoch.



Insgesamt macht ARC und NonARC hier echt Spaß, wenn man versucht einen objektorientierten Code zu schreiben, der auf allen Platformen funktioniert. Da kann man sich oft nur die Haare raufen und aufgeben. (außer man stellt alles komplett auf Interfaces um)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Jan 2020 um 15:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Operator Overloading for CLASSES (not records!)

  Alt 23. Jan 2020, 15:36
Sehr schöner Artikel! Aber auch hier: nur für Records.
Genau genommen sind Records auch Klassen.

Ich hab auch noch irgendwo beim Herumstöbern eine Erklärung gefunden, warum bisher kein operator overloading für Klassen implementiert wurde; hatte irgendwas mit dem Garbage Collector (GC) zu tun. Erklärt wurde das so, dass für jedes Mal, wo ein Operator ausgeführt wird, eine weitere Instanz der Klasse erzeugt werden müsste.
Das glaube ich schon. Wenn man genau hinschaut, mache ich das in meinem Tutorial sogar absichtlich. Für einfache Klassen müsste es trotzdem gehen. Ich sehe noch nicht mal das Freigeben als das große Problem an. Eher schon das Instantiieren der Klassen. Die meisten Klassen haben ja parametrisierte oder überladene Konstruktoren. Wie sollte der Compiler da wissen, welcher der richtige ist?
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Operator Overloading for CLASSES (not records!)

  Alt 23. Jan 2020, 15:44
Nee, das Erstellen machst du ja, in den Operatoren, und gibst es als Result zurück.
Drum ist dem Compiler das vollkommen egal.

Genau genommen sind Records auch Klassen.
In Delphi ist es andersrum.
Klassen sind intern ein Record mit einem Pointer davor. (und der Pointer zeigt in die Mitte des Records, statt auf dessen Anfang)

In Sowas wie Java, .NET und Dergleichen, da stimmt deine Aussage schon, wobei dort oft eher alles Objekte sind, soger ein schnöder Integer (drum kann der auch NULL bzw. EMPTY werden).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Jan 2020 um 15:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.006 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Operator Overloading for CLASSES (not records!)

  Alt 23. Jan 2020, 16:20
Ich bin mir ziemlich sicher, dass der equals operator für Klassen auch auf ARC keine Beachtung findet, wenn left und right vom Typen sind, dem man diesen Operator verpasst.
Denn damit würde man den schon funktionierenden = Operator für TObject überschreiben können.

Genauso kann man auch mit dem "&&op_*" Hack in einem helper einem Integer nicht seine = oder <, > Operatoren umschreiben.

Es gibt übrigens 2 Arten von Operatoren: die, die neue "Instanzen" zurückgeben, wie z.B. Addition und solche die nur Boolean o.ä. zurückliefern wie Vergleiche - letztere wären auch ohne ARC komplett problemlos möglich.

Ich hätte auch gern [WeakRef] im Non-ARC-Compiler für interface-Variablen.
Gibt's seit XE8 oder so (es heißt übrigens [Weak])

Für Records wäre auch ein ClassOperator für New, Copy und Dispose praktisch, damit man dort z.B. auch Pointer und Objekte selbst behandeln kann, die im Record stecken.
Wird früher oder später kommen - fast wär's mit 10.3 so weit gewesen - aber weint bitte nicht, wenn ihr seht, wie inperformant das implementiert ist.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (23. Jan 2020 um 16:28 Uhr)
  Mit Zitat antworten Zitat
TheSledgeHammer

Registriert seit: 22. Mai 2019
Ort: Mulfingen
43 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Operator Overloading for CLASSES (not records!)

  Alt 23. Jan 2020, 16:24
Und besonders lustig wird's dann, wenn in der Doku geschrieben steht, dass es gehen sollte.
Weil es für die ARC-Compiler ja geht.
Das steht da aber nicht, dass das nur für ARCs gilt...
Tobias
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:25 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