Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如果子类是TForm,如何继承?_Delphi - Fatal编程技术网

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

Delphi 如果子类是TForm,如何继承?,delphi,Delphi,我承认这是我第一次使用继承,所以我甚至可能选择了错误的方式,这就是为什么我在这里问你 我在我的delphi应用程序中编写了一个消息处理程序来捕获来自WSAAsyncSelect()的消息 问题是OnSockerRead和OnSocketClose是另一个类中的函数 我想在类之间建立一个良好的关系,这样具有这两个函数的类就可以访问它的父类,但同时这些东西对其他类来说是私有的 请给我一个例子,我应该怎么做,因为我不知道是抽象的还是继承的更好,因为我从来没有使用过两者。我想让我的代码更面向对象 谢谢大

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

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

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

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

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


谢谢大家!

我不认为继承是这里的答案,除非另一个类可以从MainForm派生,但这看起来很可疑

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


但是,也许您正在努力,如果它自己的(小)单元中的其他类没有其他人使用,那么将这些函数公开并不是坏事。

您可以做的一件事是使用接口来访问主窗体功能。例如,假设要从子窗体调用主窗体上的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.
您的主窗体将实现此接口(确定以保持实现私有):

从继承链中的父对象,可以实现消息处理程序,如下所示:

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;

我可以让另一个类派生自FormMain。我只是不知道抽象方法有什么用。也许抽象方法可以帮上忙?仅MainForm这个名称就表明它不适合作为基类。你能诚实地说另一个班级是一个学生吗?这是一种主要形式的特殊化?也许可以在问题中详细说明一下。@John,欢迎来到黑暗面。:)
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;