2

2回継承されたベースがあります。2番目のサブクラスはメソッドcloneのシグネチャを提供しませんが、3番目のサブクラスはメソッドcloneを提供し、次のように定義します。

  TControlObject = abstract class
  ...
  public
    method Clone:TControlObject; virtual; abstract;
  end;

  TGateControl = class(TControlObject)
  ...
  public
  ...
  end;

  TAndControl = class(TGateControl)
  public
    method Clone:TControlObject; override;
  end;

ただし、コンパイラは、TGateControlクラスがcloneメソッドの実装を提供しないというエラーを発生させます。TGateControlはTControlObjectから継承され、TAndControlクラスはTGateControlから継承されるため、メソッドcloneは基本クラスのcloneメソッドに対して自動的にオーバーライドされる必要があります。私は正しいですか?

前もって感謝します、

4

1 に答える 1

4

abstractのCloneメソッドに属性がありますTControlObject。これは、から直接派生するクラスはすべてTControlObject、Cloneメソッドの実装を提供する必要があることを意味します(MSDN要約を参照)。その結果、TGateControlはCloneの実装を提供する必要があります。クローンの具体的な実装があればTControlObject、そうです、オーバーライドする必要はありません。

したがって、いくつかのオプションは次のとおりです。

  1. abstractクローンの属性を削除します。
  2. CloneまたはのいずれかTControlObjectの実装を追加しますTGateControl

そして明確にするために、これらのメソッドは決して「自動的にオーバーライド」されません。派生クラスは基本クラスの実装を呼び出すことができますが、派生クラスが基本クラスの実装を「自動的にオーバーライド」したと言うのは誤りです。

于 2012-08-09T15:56:37.953 に答える