2009-07-14 55 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