首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果子类为TForm,该如何继承?

如果子类为TForm,该如何继承?
EN

Stack Overflow用户
提问于 2009-07-14 16:40:31
回答 2查看 423关注 0票数 3

我承认这是我第一次使用继承,所以我可能选择了错误的方式,这就是为什么我在这里问你。

我在我的delphi应用程序中编写了一个消息处理程序来捕获来自WSAAsyncSelect()的消息。

代码语言:javascript
运行
复制
procedure FormMain.MessageHandler(var Msg:Tmessage);
begin
  case WSAGetSelectEvent(MSG.LParam) of
    FD_READ: //OnSocketRead(MSG.WParam);
    FD_CLOSE: //OnSocketClose(MSG.WParam);
  end;
end;

问题是OnSockerRead和OnSocketClose是另一个类中的函数。

我希望在类之间建立良好的关系,这样具有这两个函数的类可以访问它的父类,但同时这些东西对其他类是私有的。

请给我一个例子,我应该怎么做,因为我不知道是抽象的还是继承的更好,因为我从来没有用过这两个东西。我想让我的代码更面向对象。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-14 17:24:22

您可以做的一件事是使用接口来访问主窗体功能。例如,假设您想从子窗体中调用主窗体上的SocketRead或SocketClose。您可以只在单元的实现中使用mainform,但我尽量避免这种类型的循环引用。另一种选择是创建一个包含共享接口的新单元,并由主窗体和子单元使用它。例如:

代码语言:javascript
运行
复制
unit MainFormShared;
interface
type
  IMainFormShared = interface
    ['{A2C624D5-DDCF-49D6-8B03-791BA0B79A42}']
    procedure SocketRead(var Handle : Integer);
    procedure SocketClose(Var Handle : Integer);
  end;
implementation
end.

您的主窗体将实现此接口(可以将实现保持为私有):

代码语言:javascript
运行
复制
type
  tMainForm = class(TForm,IMainFormShared)
  :
  private
    procedure SocketRead(var Handle : Integer);
    procedure SocketClose(Var Handle : Integer);
  end;

在继承链中的父对象中,您可以像这样实现消息处理程序:

代码语言:javascript
运行
复制
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;
票数 7
EN

Stack Overflow用户

发布于 2009-07-14 16:51:58

我不认为继承是这里的答案,除非OtherClass可以从MainForm派生,但这看起来令人怀疑。

开放访问的一种方法是将两个类放在同一个单元中。这让他们可以即时访问彼此的实现细节。

但也许你正在努力尝试,如果OtherClass在它自己的(小)单元中,其他人都没有使用,那么将这些函数公开并不是那么糟糕。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1126609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档