Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.29;
Скачать: CL | DM;

Вниз

Множественное наследование   Найти похожие ветки 

 
zensan ©   (2008-06-02 16:49) [0]

Добрый день!

Подскажите незнающему..

Предположим такую ситуацию:


type
 TFirst = class(TForm)
   ...
 end

 TSecond = class(TFrame)
   ...
 end;


В обоих классах у меня описиваются несколько идентичных методов (в моём случае 3).

Можно ли в Дельфи сделать множественное наследование? не симуляцию с:


type
 ICommon = interface(IInterface)
   procedure Method1;
   procedure Method2;
   procedure Method3;
 end;

а затем..

type
 TFirst = class(TForm, ICommon)
   ...
 end

 TSecond = class(TFrame, ICommon)
   ...
 end;


Этот вариант не очень хорош (я его как раз сеичас и использую), потому что по прежнему в каждом классе надо писать код етих методов от руки и реализовать метод в Interface нельзя.

Пример чего я хочу (абстрактно конечно, такой синтаксис недопустим):


const WM_DATA = WM_USER + 1;

type
 TCommon = class(TWinControl)
   procedure Method1;
   procedure OnData(var Msg: TDataMessage); message WM_DATA;
   ...
 end;
 TFirst = class(TForm, TCommon)
   ...
 end

 TSecond = class(TFrame, TCommon)
   ...
 end;

implementation

procedure TCommon.Method1;
begin
 ...operations with Self...
end;

procedure TCommon.OnData(var Msg: TMessage); message WM_DATA;
begin
 ...
end;


Если "interface" единственное решение, то скажите..


 
zensan ©   (2008-06-02 16:52) [1]

Проблема просто что я немогу подогнать классы под один базовый, который всё это делал бы. Тогда бы небыло проблемы.


 
Ega23 ©   (2008-06-02 17:08) [2]

создай базовый класс, в нём пропиши методы ICommon, сделай их виртуальными.
Ну а в потомка х - перекрывай если надо.


 
jack128_   (2008-06-02 17:14) [3]

делаешь класс
 TCommon = class(TAggregatedObject, Icommon)
 // тут реализация методов ICommon
 end;

type
 TControl1 = class(TWinControl, Icommon)
 private
   FCommonImpl: TCommon;
 public
   property  CommonImpl: ICommon read GetCommonImpl implements ICommon;
 end;

 TControl2 = class(TWinControl, Icommon)
 private
   FCommonImpl: TCommon;
 public
   property  CommonImpl: ICommon read GetCommonImpl implements ICommon;
 end;

таким образом весь общий код будет у тя в классе TCommon.


 
ZENsan ©   (2008-06-02 17:18) [4]

О! Спасибо..! А как быть с MESSAGE процедурой...всё таки придётся описать в каждом да?


 
ZENsan ©   (2008-06-02 17:20) [5]


> создай базовый класс, в нём пропиши методы ICommon, сделай
> их виртуальными.Ну а в потомка х - перекрывай если надо.
>


Я про это вообще-то написал. Что так сделать я не могу. TForm i TFrame - два разных класса и привести к одному немогу..


 
ZENsan ©   (2008-06-02 17:23) [6]

хм... А как же Self в твоём случае??? Ещё дополнительное поле создавать чтобы Self передавать ICommon?


 
ZENsan ©   (2008-06-02 17:38) [7]

Спасибо jack128_  за предложенное решение. Жаль, что оно всё таки не совсем объектное и выносит реализацию за пределы объекта и перекрывать их не так удобно уже...


 
ZENsan ©   (2008-06-02 17:42) [8]

И что делать после того как наследовал TControl2 в другом классе и надо перекрить метод один? Опять новый интерфейс создавать...

Да впрочем на самом деле наверное просто проше интерфейс простой напрямую да и все не?


 
Игорь Шевченко ©   (2008-06-02 23:39) [9]

Я сомневаюсь, что обработчики сообщений можно вынести в интерфейс.
Хотя сам не пробовал, ничего не могу сказать.


 
KSergey ©   (2008-06-03 07:29) [10]

Если уж код обработки сообщения весь из себя такой одинаковый, то обычные функции никто не отменял. И никаких интерфейсов, тем более, что ничего полезного в их внедрении я тут не вижу. Впрочем, не силен.


 
jack128_   (2008-06-03 10:36) [11]

нет, конечно, обработчики сообщений нельзя вынести в интерфейс, но всегда мона вынести реализацию метода Dispatch туда.
то есть написать перекрыть TControl1/TControl2.Dispatch и перенаправить эти вызовы в TCommonImpl.Dispath, а уже в классе TCommonImpl - реализовать обработку сообщений. Но тут могут быть свои тонкости, в зависимости  от задачи...


> Опять новый интерфейс создавать..

зачем?? просто перекрыть реализацию метода существующего интерфейса:

Icommon = interface
 procedure DoWork;
end;

TControl2 = class(TWinControl, Icommon)
private
  FCommonImpl: TCommon;
public
  property  CommonImpl: ICommon read GetCommonImpl implements ICommon;
end;

 TControl3 = class(TControl2, ICommon)
  procedure DoWork;
 end

if Control2Var.GetInterface(ICommon, Intf) then
 Intf.DoWork; // будет вызван TControl3.DoWork;


 
ZENsan ©   (2008-06-03 11:20) [12]

Спасибо.. Но я писал что у меня TForm i TFrame и мне их от одного класса ну никак не унаследовать, поэтому так мне не идёт. А с интерфейсом - я так и делал, просто думал можно как-нибудь схитрить.
Фишка в том что я хотел как-то подобным образом как интерфейс добавить уже описанные методы в существующие классы формы и фрейма (я их не могу от одного класса никак унаследовать - если бы так было небыло бы проблем). Вот я и спрашивал, может есть какая возможность кроме интерфейса, который просто контролирует реализацию этих методов.
У меня эти два класаа АБСОЛЮТНО разные и не могут наследовать от одного класса что-то, поэтому я делал интерфейс. И спрашивал может можно как-нибудь схитрить...(но не описивая локальные своиства-интерфейсы...). Так как потом эти классы наследуются и в них эти методы переписиваются. Это почти самые корневые классы (2 уровень TFrame->TSomeClass->XXX). А с этих базовых форм и фреймов разветвляются все остальные классы.



Страницы: 1 вся ветка

Текущий архив: 2008.06.29;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.025 c
15-1210830736
User1
2008-05-15 09:52
2008.06.29
"Подбить результат"


8-1182507646
leonidus
2007-06-22 14:20
2008.06.29
Ищу библиотеку для работы с RAW-файлами


2-1212069255
Vlad Oshin
2008-05-29 17:54
2008.06.29
RTTI. Не понял что за результат


2-1212124608
кот
2008-05-30 09:16
2008.06.29
Символьное значение числа


15-1209458145
inew
2008-04-29 12:35
2008.06.29
Tabel1.filter