Du hast eine
Instanz-Methode gebaut und versuchst sie über die Klasse aufzurufen,
obwohl es dafür eine Variable/Instanz (mit Create vorher) benötigt.
Delphi-Quellcode:
V := AliasKlasse.Create;
V.HashFile('DummyString');
V.Free; // natürlich noch mit try-finally drumrum
Aber würdest du es als KlassenMethode oder statische Klassenmethode bauen, dann ginge es (wenn außerhalb der Methode, von der Klasse nichts Anderes verwendet wird),
wobei es da auch egal ist, ob Klasse oder Record.
Delphi-Quellcode:
type
//Ttools = record
Ttools = class
public
function HashFile1(FilePathName: string): string; // Self=Objectinstanz
class function HashFile2(FilePathName: string): string; // Self=Klassentyp
class function HashFile2(FilePathName: string): string; static; // hier ohne den sonst unsichtbaren impliziten Self-Parameter
end;
Wer will, kann auch moch mit abstract, final und Co. an der Klasse rumspielen.
Früher hatte ich
abstract benutzt, um im Compiler schon eine Meldung zu bekommen, bei Klassen die garnicht instantiiert werden
sollen müssen ... inzwischen nehme ich sowieso
record dafür.
weil siehe Note:
https://docwiki.embarcadero.com/RADS...i)#Class_Types
http://delphiprogrammingdiary.blogsp...lasses-in.html
Denn dem Record ist alles egal, ob Typ oder Variable.
Bei einer Klasse muß man, für eine Klassenmethode (ohne static), den Typ oder eine instantiierte Variable benutzen,
sonst knallt es, weil nicht der Typ der Variable, sondern der Typ in der Instanz benutzt wird.
Der Alias wäre hier auch nicht nötigt, denn kannst ja direkt TTools benutzen.
Und bei solchen AliasUnits ala #2 aufpassen, dass man z.B. Typen aus Parametern und Property nicht vergisst weiterzuleiten, sowie nötige Konstanten und bei Sets/Enums auch jeden einzelnen Wert.