Форум: "Начинающим";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];
ВнизМножественное наследование Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.045 c