E2211 '%s' の宣言が interface '%s' での宣言と異なっています (Delphi)
エラーと警告のメッセージ(Delphi) への移動
インターフェースを実装するクラス内のメソッドの宣言が,インターフェース内での定義と異なっています。原因としては,パラメータ型または戻り値が異なっている,クラス内のメソッドがメッセージメソッドである,クラス内の識別子がフィールドである,あるいはクラス内の識別子がインターフェース内の定義と一致しないプロパティであることが考えられます。
program Produce; type IBaseIntf = interface procedure p0(var x : Shortint); procedure p1(var x : Integer); procedure p2(var x : Integer); end; TBaseClass = class (TInterfacedObject) procedure p1(var x : Integer); message 151; end; TExtClass = class (TBaseClass, IBaseIntf) p2 : Integer; procedure p0(var x : Integer); procedure p1(var x : Integer); override; end; procedure TBaseClass.p1(var x : Integer); begin end; procedure TExtClass.p0(var x : Integer); begin end; procedure TExtClass.p1(var x : Integer); begin end; begin end.
{ この例のように,一般にこのタイプのエラーは見つけやすい。ただし,p1 を見ればわかるように,状況はやや微妙である。p1 は継承したクラスの手続きをオーバーライドしているので,p1 は基本クラスで定義された可視性も継承することになる }
program Solve; type IBaseIntf = interface procedure p0(var x : Shortint); procedure p1(var x : Integer); procedure p2(var x : Integer); end; TBaseClass = class (TInterfacedObject) procedure p1(var x : Integer); message 151; end; TExtClass = class (TBaseClass, IBaseIntf) p2 : Integer; procedure IBaseIntf.p1 = p3; procedure IBaseIntf.p2 = p4; procedure p0(var x : Shortint); procedure p1(var x : Integer); override; procedure p3(var x : Integer); procedure p4(var x : Integer); end; procedure TBaseClass.p1(var x : Integer); begin end; procedure TExtClass.p0(var x : Shortint); begin end; procedure TExtClass.p1(var x : Integer); begin end; procedure TExtClass.p3(var x : Integer); begin end; procedure TExtClass.p4(var x : Integer); begin end; begin end.
{ この問題を解決するアプローチの 1 つは,次の例のように,問題のありそうな識別子それぞれに message 解決節を使用すること。もう 1 つのアプローチは,設計には熟慮が必要となるが,コンパイルの前にクラス識別子がインターフェース識別子と互換となるようにしておくこと }