Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Переопределить глубокозарытый метод.


Alexey (AZ) ©   (2007-03-18 18:56:00) 

Доброго времени!
Возник вопрос, думаю как можно сделать. Исходник вот:
ServerSocket.Socket.Connections[i].Close;
Мне бы прокопать до Close и прилепить в него часть своего кода. Править исходники-оригиналы с этими классами не хочется. Не придется ли мне перенаследовать всю эту цепочку в обратном порядке? (Т.е. переписать Connections[i] с своим Close, на них построить MySocket из Socket, на них MyServerSocket из Serversocket  ... короче, я думаю что понятно). Меня, мягко говоря, такая идея не привлекает, а говоря по правде, это полная ж... =)

p.s. Влепить свой код в событие OnClose/OnDisconnect не предлагать.


Сергей М.   (2007-03-19 08:25:00) [1]


> Alexey (AZ)


Если уж так приспичило, то перекрывать следует не Close, а Disconnect().
Это виртуальный метод, и Close не делает ничего иного, кроме вызова этого метода.
Но при наличии события On[Client]Disconnect вся эта затея действительно лишена смысла.


Плохиш   (2007-03-19 01:45:00) [2]


> Alexey (AZ)   (18.03.07 20:29) [12]
> Ладно, буду использовать OnClose.

Тем более он для описанного в [0] и предназначен...


Alexey (AZ)   (2007-03-18 20:29:00) [3]

Ладно, буду использовать OnClose. Вроде ничем не хуже должно быть.


Kolan   (2007-03-18 20:14:00) [4]

> Метод статический, оверрид неприменим.

Ну закройтеего раз так нужно…


Kolan   (2007-03-18 20:14:00) [5]

> Это не просто класс, а компонент,

Ну а в чем разница? Сделайте свой компонент, какие проблеммы…


Kolan   (2007-03-18 20:13:00) [6]

> Я правильно понимаю?

Нет мне видится не так. Создать надо подкласскласса экземплярами которого являются элементы Connections(те Connections[i]).


> Это не просто класс, а компонент, поэтому я интересуюсь
> как бы перехрячить всего-навсего один метод, без перенаследований.

Идеальный вариант — «хелперы»… Мож всетаки нароете BDS, TurboDelphi

PS
 Что они есть в Turbo версии неуверен…

PSS
 Есть еще вариан, если все это стандартные компоненты, возможно вы просто не умеете ими пользоваться. Возможно вообще менять ниче ненадо…


Alexey (AZ)   (2007-03-18 20:05:00) [7]

Метод статический, оверрид неприменим. Вам видится решение в создании своего класса таким образом, что обеъкт ServerSocket должен стать TMyserverSocket. Я правильно понимаю? Это не просто класс, а компонент, поэтому я интересуюсь как бы перехрячить всего-навсего один метод, без перенаследований.


Kolan   (2007-03-18 19:58:00) [8]

> Здесь ServerSocket — объект, Socket — свойство, Connections[i]
> — свойство и наконец Close — метод

Еще раз повторяю последовательность вызовов почти ничего не раскрывает, нужна диаграмма классов, или её словесное описание…


Kolan   (2007-03-18 19:51:00) [9]

> Что такое overload? =)

Это директива, подробно в справке, а сокращенно:
overload — перегрузка операций.
Пример:
 procedure Close; overload;
 procedure Close(SomeParam: Integer); overload;


Вызывать можно любую…


> Короче, ServerSocket — это класс ТServerSocket,

Я с этим незнаком, но уверен многие другие знакомы…


> Connections[i] — свойство

Ну и что? Какой тип у этого свойства?
Например если:
TSomeObject = class
 procedure Close; virtual;
end;

и
Connections[i]: TSomeObjectList;

То можно сделать наследника TSomeObject и перекрыть Close:
TAnotherSomeObject = class(TSomeObject)
 procedure Close; override;
end;


Alexey (AZ)   (2007-03-18 19:40:00) [10]

Что такое overload? =)
Короче, ServerSocket - это класс ТServerSocket, в нем есть Socket - TXXXServerWinSocket, в котором есть массив Connections - TXXXCustomSocket. Просто сейчас точные названия классов привести не могу.
Здесь ServerSocket - объект, Socket - свойство, Connections[i] - свойство и наконец Close - метод. Я не знаю как иначе объяснить, вроде вопрос должен быть поянтен.


Kolan   (2007-03-18 19:22:00) [11]

> ServerSocket.Socket.Connections[i].Close;

Вобщето ни очем не говорит, нужна диаграмма классов…

Может возможно создать наследника класса Connections[i]и там переопределить Close…


Kolan   (2007-03-18 19:20:00) [12]

> А если не BDS 2006 ?


Если
> Править исходники-оригиналы с этими классами не хочется.

то подругому никак, имхо.


> Т.е. переписать Connections[i] с своим Close,

а может overload?


Alexey (AZ)   (2007-03-18 19:12:00) [13]

А если не BDS 2006 ?


Kolan   (2007-03-18 19:03:00) [14]

Прочитай про class helpers, если у тебя © BDS 2006…


Наверх

Титульная страница Поиск, карта сайта Написать письмо