メソッドを無効にしたい

解決


nakam  2009-07-02 22:33:40  No: 34995

TListを継承したクラスTListExを作成して、
Addメソッドを使えなくしたいのですが、
どのような方法がありますでしょうか。


Mr.XRAY  2009-07-03 18:13:26  No: 34996

こんにちは.Mr.XRAYです.

>Addメソッドを使えなくしたいのですが、

使えなくするという意味は,
1. メンバーから全くなくしてしまう
2. 存在するが,実際にはAddの機能を無効にする

ということが考えられます.
1.  は,TListのAddはpublicメンバなので遮蔽できません.したがってAddがないTListを
      自分で全て新規作成する
2.  は,自分でAddを再定義する(この場合,Addメソッドそのものは存在することになる)

のどちらかしかないでしょう.
メソッドやプロパティは再定義すれば,それが使用されます.


nakam  2009-07-03 19:53:16  No: 34997

ありがとうございます。
自前でAddExメソッドを作る代わりに、元のAddメソッドを無効に
したかったのですが、メソッドの再定義でもできそうです。ちなみに、

TListEx = class(TList)
  function Add(Item: TFoo): Integer;
end;

とした場合、

function TListEx.Add(Item: TFoo): Integer;
begin
  inherited Add(Item);
end;

でいいのでしょうか。
戻り値のIntegerをどう取るかが分からないのですが。


Mr.XRAY  2009-07-03 20:16:06  No: 34998

> inherited Add(Item);

inheritedというのは,元のコードを実行するものです.
これではAddは無効になりません.
完全無効にするのであれば,

procedure TListEx.Add(Item: Pointer);
begin
//
end;

でしょうか.無効なのでfunctionにする必要がないなら.
count値を取得したいなら,functionで,

Result := count;

でしょうか.TListのAdd関数はvirtualでもdynamicでもないので,コードは自由です.
引数なしも,引数のリストの変更も自由です.
参考までに,元が関数の時は,その元の関数値を取得するのは

Result := inherited Add(Item);

ですね.inheritedが元の関数ですから.


nakam  2009-07-03 20:36:47  No: 34999

ありがとうございます。
試してみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加