2009-07-14 4 views
3

Я признаю, что это первый раз, когда я использую наследование, поэтому я, возможно, даже выбрал неправильный путь, вот почему я здесь прошу вас.Как наследовать, если дочерний класс TForm?

Я написал сообщение Handler в моем 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, которые находятся в основной форме из вашей дочерней формы. вы МОЖЕТЕ использовать основную форму при реализации устройства, но я стараюсь избегать этих типов циркулярных ссылок. Другой вариант - создать новый блок для хранения общего интерфейса и использовать его как с основной формой, так и с дочерним блоком. Например:

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; 
+0

Жаль, что я мог бы возвысить больше! –

+0

@John, Добро пожаловать в темную сторону. :) – skamradt

1

Я не думаю, что наследование является ответом здесь, если только это не может быть получено из MainForm, но это выглядит сомнительным.

Одним из способов открытия доступа является размещение обоих классов в одном устройстве. Это дает им мгновенный доступ к деталям реализации друг друга.

Но, может быть, вы пытаетесь усердно здесь, если OtherClass в своем собственном (маленьком) блоке, который никто другой не использует, тогда не будет так плохо, чтобы эти функции были открытыми.

+0

Я могу сделать другой класс полученным из FormMain.I только не знаю, что такое использование абстрактных методов. Может ли абстрактный метод помочь? –

+0

Только имя MainForm предполагает, что он не подходит в качестве базового класса. Можете ли вы честно сказать, что OtherClass IS A TMainForm? Т.е. это специализация MainForm? Может быть, это немного детализирует вопрос. –

Смежные вопросы