如果子类是TForm,如何继承?

时间:2009-07-14 16:40:31

标签: delphi

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

我在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;

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

我希望在类之间建立良好的关系,这样具有这两个函数的类可以访问它的父级,但同时也要将其作为其他类的私有。

请给我一个例子,我该怎么做,因为我不知道抽象或继承是否更好,因为我从未使用过它们。我想让我的代码更加OO。

谢谢!

2 个答案:

答案 0 :(得分:7)

您可以做的一件事是使用接口来访问主窗体功能。例如,假设您要调用子表单中主窗体上的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.

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

type
  tMainForm = class(TForm,IMainFormShared)
  :
  private
    procedure SocketRead(var Handle : Integer);
    procedure SocketClose(Var Handle : Integer);
  end;

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

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;

答案 1 :(得分:1)

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

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

但是也许你在这里努力,如果其他人没有使用其自身(小)单位的其他类别,那么将这些功能公之于众也不会那么糟糕。