メソッドを無効にしたい

解決


nakam  2009-07-02 13:33:40  No: 34995  IP: 192.*.*.*

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

編集 削除
Mr.XRAY  2009-07-03 09:13:26  No: 34996  IP: 192.*.*.*

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

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

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

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

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

編集 削除
nakam  2009-07-03 10:53:16  No: 34997  IP: 192.*.*.*

ありがとうございます。
自前で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 11:16:06  No: 34998  IP: 192.*.*.*

> 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 11:36:47  No: 34999  IP: 192.*.*.*

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

編集 削除