我承认这是我第一次使用继承,所以我甚至可能选择了错误的方式,这就是我在这里问你的原因.
我在delphi应用程序中编写了一个Message Handler来捕获来自WSAAsyncSelect()的消息
procedure FormMain.MessageHandler(var Msg:Tmessage);
begin
case WSAGetSelectEvent(MSG.LParam) of
FD_READ: //OnSocketRead(MSG.WParam);
FD_CLOSE: //OnSocketClose(MSG.WParam);
end;
end;
Run Code Online (Sandbox Code Playgroud)
问题是OnSockerRead和OnSocketClose是另一个类中的函数.
我希望在类之间建立良好的关系,以便具有这两个函数的类可以访问它的父级,但同时将其他东西私有化.
请给我一个例子,我该怎么做,因为我不知道抽象或继承是否更好,因为我从未使用过它们.我想让我的代码更加OO.
谢谢!
您可以做的一件事是使用接口来访问主窗体功能.例如,假设您要调用子表单中主窗体上的SocketRead或SocketClose.你可以在单元的实现中使用mainform,但我尽量避免使用这些类型的循环引用.另一种选择是创建一个新单元以包含共享接口,并由主窗体和子单元使用它.例如:
unit MainFormShared;
interface
type
IMainFormShared = interface
['{A2C624D5-DDCF-49D6-8B03-791BA0B79A42}']
procedure SocketRead(var Handle : Integer);
procedure SocketClose(Var Handle : Integer);
end;
implementation
end.
Run Code Online (Sandbox Code Playgroud)
您的主窗体将实现此接口(确保将实现保持为私有):
type
tMainForm = class(TForm,IMainFormShared)
:
private
procedure SocketRead(var Handle : Integer);
procedure SocketClose(Var Handle : Integer);
end;
Run Code Online (Sandbox Code Playgroud)
从继承链中的父对象,您可以像这样实现消息处理程序:
procedure TParentForm.MessageHandler(var Msg:Tmessage);
var
fMainFormShared : IMainFormShared;
begin
case WSAGetSelectEvent(MSG.LParam) of
FD_READ:
if Supports(Application.MainForm, IMainFormShared,fMainFormShared) then
fMainFormShared.SocketRead(Msg.WParam);
FD_CLOSE: //OnSocketClose(MSG.WParam);
if Supports(Application.MainForm, IMainFormShared,fMainFormShared) then
fMainFormShared.SocketClose(Msg.WParam);
end;
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
388 次 |
| 最近记录: |