Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.042 c
2-1212241497
9899100
2008-05-31 17:44
2008.06.29
ресурсы


15-1210778077
Fredy314
2008-05-14 19:14
2008.06.29
Вечно целая винда.


2-1212413687
Massiv
2008-06-02 17:34
2008.06.29
Копия массива


2-1212313498
alex-drob
2008-06-01 13:44
2008.06.29
Как обьеденить две области памяти


15-1210658822
БарЛог
2008-05-13 10:07
2008.06.29
Домен зарегистрирован, не делегирован





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский