在我之前的问题中,我被建议使用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;
如何使用界面集中代码? 如何在界面的帮助下共享新属性?
答案 0 :(得分:3)
接口方法声明中不允许使用message关键字。删除message WM_SIZE;
,代码将运行正常,直到编译器遇到第二个问题 - 见下文
接口方法永远不会有自己的实现。如果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;