2009-07-14 58 views
3

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

我在Delphi应用程序写了一个消息处理程序捕获从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。

谢谢!

回答

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. 

你的主要形式是实现此接口(OK保证实现私有):

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

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

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

但也许你正在努力在这里,如果OtherClass在它自己的(小)单位,没有其他人使用,那么它将不会那么糟糕,使这些功能公开。

+0

我可以让其他类从FormMain.I派生只是不知道什么是抽象方法的用法。也许抽象方法可以帮助吗? – 2009-07-14 16:59:51

+0

仅MainForm的名称表明它不适合作为基类。你能诚实地说其他类是TMainForm吗?即它是MainForm的专业化?也许在问题中详细一点。 – 2009-07-14 17:20:55