今、話題(2chのDelphiスレだけで)の class helper 使ってみました。
ruby だと
class String
def increment
result = "";
self.each_byte do |c|
result << (c + 1).chr
end
result
end
end
p "HAL".increment
という風に書くのを、Delphi で書くと、
program test;
{$APPTYPE CONSOLE}
uses SysUtils, Classes;
type
TMyClassHelper = class helper for TStringStream
function Increment: string;
end;
{ TMyClassHelper }
function TMyClassHelper.Increment: string;
var i: Integer;
begin
Result := '';
for i := 1 to Length(DataString) do
Result := Result + Char(Ord(DataString[i]) + 1);
end;
procedure Main;
var s: TStringStream;
begin
s := TStringStream.Create('HAL');
try
Writeln(s.Increment);
finally
s.Free
end;
end;
begin
Main;
{$WARN SYMBOL_PLATFORM OFF} if DebugHook <> 0 then Readln; {$WARN SYMBOL_PLATFORM ON}
end.
となる。
(stringがクラスじゃないので、TStringStreamで代用……)
これって、Mixinじゃない?
下手すると変なコードを量産しそうだけど、
使いようによっては、かなり使えるんじゃないんだろか?
あと、よく考えたら、アスペクト指向的にも使えね?
program test;
{$APPTYPE CONSOLE}
uses SysUtils, Classes;
type
TStringList = class helper for TStringList
function Add(const S: string): Integer;
end;
{ TMyClassHelper }
function TMyClassHelper.Add(const S: string): Integer;
begin
Writeln('start - TStringList.Add(' + S + ')');
Result := inherited Add(S);
Writeln('end - TStringList.Add');
end;
procedure Main;
var s: TStringList;
begin
s := TStringList.Create;
try
s.Add('Hoge');
s.Add('Moge');
s.Add('Mage');
Writeln('Count = ', s.Count);
finally
s.Free
end;
end;
begin
Main;
{$WARN SYMBOL_PLATFORM OFF} if DebugHook <> 0 then Readln; {$WARN SYMBOL_PLATFORM ON}
end.
出力結果は以下。
start - TStringList.Add(Hoge)
end - TStringList.Add
start - TStringList.Add(Moge)
end - TStringList.Add
start - TStringList.Add(Mage)
end - TStringList.Add
Count = 3
ちょwww!?これはっwww
なんだか、脳汁が出てきましたよwww!?
とりあえず、標準出力にデバッグ文出してるだけだけど、
関数の実行時間を測ったり、用途はいろいろありますなー。
ヘルプに書いてある、
『ただし,ソースコード内の特定の場所では,最大 1 つのクラスヘルパーだけが適用されます。』
というのがなんだか、(´・ω・`)ショボーン 。
複数のクラスヘルパー適用できないのかい!
って、実は使えなさげな雰囲気もかもしだしておりますが、
class helperは、面白そうな機能であることは確かです。
カテゴリ: [ Delphi ]