如何使用VCL类的接口?

时间:2012-01-10 15:29:18

标签: delphi delphi-7

在我之前的问题中,我被建议使用Interface: How to implement identical methods with 2 and more Classes?

但由于我不知道如何使用接口,所以没有任何条件符合。

我猜你可以把这段代码称为伪:)

type
  IDoSomething = interface
    ['{EFE0308B-A85D-4DF3-889C-40FBC8FE84D0}']
    procedure DoSomething1;
    procedure WMSize(var Message: TWMSize); message WM_SIZE; // <- Unknown directive: 'message'
  end;

  TMyCheckBox = class(TCheckBox, IDoSomething) // <- Undeclared identifier: 'DoSomething1'
  end;

  TMyRadioButton = class(TRadioButton, IDoSomething) // <- Undeclared identifier: 'DoSomething1'
  end;

implementation

procedure IDoSomething.DoSomething1; // Identifier redeclared: 'IDoSomething'
begin
  // do the same thing for TMyCheckBox and TRadioButton
end;

procedure IDoSomething.WMSize(var Message: TWMSize);
begin
  // handle this message the same as with TMyCheckBox and TRadioButton
end;

如何使用界面集中代码? 如何在界面的帮助下共享新属性?

3 个答案:

答案 0 :(得分:3)

  1. 接口方法声明中不允许使用message关键字。删除message WM_SIZE;,代码将运行正常,直到编译器遇到第二个问题 - 见下文

  2. 接口方法永远不会有自己的实现。如果IDoSomething接口声明方法DoSomething1,编译器将不允许在代码中编写类似procedure IDoSomething.DoSomething1;的实现 - 相反,实现接口的类必须提供实现体。

答案 1 :(得分:2)

这是我的观点:

1)您不能包含在界面定义中

procedure WMSize(var Message: TWMSize); message WM_SIZE;

因为它实际上是动态方法:

请记住,界面定义中的方法不能声明为虚拟动态抽象覆盖。< / p>

2)包括在界面定义中

procedure WMSize(var Message: TWMSize);

是一个废话,因为它不是要进一步实施的方法的签名。

接口定义应该是裸的:

type
 IDoSomething = interface
   ['{EFE0308B-A85D-4DF3-889C-40FBC8FE84D0}']
   procedure DoSomething1;
 end;

以下类定义保持不变(其实现相同):

TMyCheckBox = class(TCheckBox, IDoSomething)
  procedure DoSomething1;
  procedure WMSize(var Message: TWMSize); message WM_SIZE;
end;

TMyRadioButton = class(TRadioButton, IDoSomething) 
  procedure DoSomething1;
  procedure WMSize(var Message: TWMSize); message WM_SIZE;
end;


implementation

procedure TMyCheckBox.DoSomething1;
begin
  //
end;

procedure TMyCheckBox.WMSize(var Message: TWMSize);
begin
  //
end;

{ TMyRadioButton }

procedure TMyRadioButton.DoSomething1;
begin
  //
end;

procedure TMyRadioButton.WMSize(var Message: TWMSize);
begin
  //
end;

答案 2 :(得分:1)

顾名思义:接口是接口的声明 - 而不是实现。这对于tey来说是极其重要的。即使您对课程一无所知,它们也可以让您在不同的课程中调用例程 由于不同的类可以实现相同的接口,因此实现可能完全不同。 所以你的代码看起来像这样:

type
  IDoSomething = interface
    ['{EFE0308B-A85D-4DF3-889C-40FBC8FE84D0}']
    procedure DoSomething1;
    procedure WMSize(var Message: TWMSize); 
  end;

  TMyCheckBox = class(TCheckBox, IDoSomething)
  public
    procedure DoSomething1;
    procedure WMSize(var Message: TWMSize); message WM_SIZE;
  end;

  TMyRadioButton = class(TRadioButton, IDoSomething) 
    procedure DoSomething1;
    procedure WMSize(var Message: TWMSize); message WM_SIZE;
  end;

implementation

procedure TMyCheckBox.DoSomething1; 
begin
  // do the same thing for TMyCheckBox and TRadioButton
end;

procedure TMyCheckBox.WMSize(var Message: TWMSize);
begin
  // handle this message the same as with TMyCheckBox and TRadioButton
end;

procedure TMyRadioButton.DoSomething1; 
begin
  // do the same thing for TMyCheckBox and TRadioButton
end;

procedure TMyRadioButton.WMSize(var Message: TWMSize);
begin
  // handle this message the same as with TMyCheckBox and TRadioButton
end;