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

Вниз

Полиморфизм без наследования.   Найти похожие ветки 

 
И. Павел ©   (2010-08-02 14:49) [0]

Здравствуйте.

У меня есть несколько компонентов разных типов. Все они имеют свойство color. При этом общего наследника, содержащего это свойство, у них нет.
Подскажите, пожалуйста, как можно присваивать эти компоненты (или их адреса) одной общей переменной, так чтобы при вызове ее свойства color выполнялось свойство нужного компонента? Т.е. организовать что-то вроде полиморфизма.

Например:

procedure F(C: ???);
begin
 C.Color := clRed;
end;


F(Edit1)
F(DBLoockupComboBox1)


Можно ли в данном случае как-то использовать Variant или OleVariant, и, если можно, то как?

Заранее спасибо.


 
Amoeba_   (2010-08-02 14:55) [1]


> При этом общего наследника, содержащего это свойство, у
> них нет.

Наверно имеется в виду все-таки общий предок?


> Можно ли в данном случае как-то использовать Variant или
> OleVariant

Нет.


 
И. Павел ©   (2010-08-02 15:07) [2]


> [1] Amoeba_   (02.08.10 14:55)

Спасибо.


> Наверно имеется в виду все-таки общий предок?

да


 
Anatoly Podgoretsky ©   (2010-08-02 16:10) [3]

> И. Павел  (02.08.2010 14:49:00)  [0]

Published и RTTI


 
Юрий Зотов ©   (2010-08-02 16:30) [4]

Вариантов несколько. Что выбрать - зависит от задачи.

1. Все-таки сделать общего предка. Если, к тому же это будет TControl, то и новое свойство уже не нужно, оно и так есть.

2. Вынести свойство в Interface, все классы сделать реализаторами этого интерфейса.

3. Хелперы.

4. [3] - Published и RTTI


 
Юрий Зотов ©   (2010-08-02 17:12) [5]

Если речь идет только о том, что приведено в примере кода, то и никаких классов не надо, все намного проще:

type
 TFriendControl = class(TControl);

procedure F(C: TControl);
begin
 TFriendControl(C).Color := clRed;
end;


F(Edit1);
F(DBLoockupComboBox1);


 
Германн ©   (2010-08-02 17:31) [6]

Хакеры стали друзьями?
:)


 
Юрий Зотов ©   (2010-08-02 18:08) [7]


> Германн ©   (02.08.10 17:31) [6]

Дружественный класс. Похоже на него, во всяком случае. Отсюда и название.


 
Anatoly Podgoretsky ©   (2010-08-02 18:14) [8]

Другое более точное название HackClass

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


 
И. Павел ©   (2010-08-02 18:53) [9]


> Юрий Зотов ©   (02.08.10 17:12) [5]

Большое спасибо. Это то что нужно.

Amoeba_, Anatoly Podgoretsky ©  спасибо.


 
Игорь Шевченко ©   (2010-08-02 18:54) [10]

SetOrdProp


 
И. Павел ©   (2010-08-02 19:24) [11]


> Игорь Шевченко ©   (02.08.10 18:54) [10]
> SetOrdProp

Спасибо. Тоже интересный способ.


 
Юрий Зотов ©   (2010-08-02 19:35) [12]

> И. Павел ©   (02.08.10 19:24) [11]

Только для published.


 
Юрий Зотов ©   (2010-08-02 19:54) [13]

> И. Павел ©   (02.08.10 14:49)  

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

"У меня есть несколько компонентов разных типов. Все они имеют свойство color. При этом общего наследника, содержащего это свойство, у них нет".

И все думают, что это Ваши компоненты. А они, оказывается, стандартные, и у них целая куча общих предков (кстати, предков, а не наследников, тут Вы ошиблись). Вот эти предки: TObject - TPersistent - TComponent - TControl, и у последнего уже есть свойство Color. Поэтому вопрос задан так, что вводит в заблуждение.


 
Германн ©   (2010-08-03 03:03) [14]

Удалено модератором


 
Юрий Зотов ©   (2010-08-03 08:31) [15]

Удалено модератором



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

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

Наверх




Память: 0.5 MB
Время: 0.007 c
2-1280118410
linuxoid
2010-07-26 08:26
2010.10.24
как правильнее составить цикл?


2-1280840158
mylasthit
2010-08-03 16:55
2010.10.24
Создание N кол-ва обьектов, кодом и редактирование каждого обьект


11-1225220808
AnarchyMob
2008-10-28 22:06
2010.10.24
Как узнать хендл элемента зная его индификатор в ресурсе?


15-1279649508
Цукор5
2010-07-20 22:11
2010.10.24
Скриншот с мышью


15-1279407333
Германн
2010-07-18 02:55
2010.10.24
Replace in files. (Очередной дурацкий вопрос от Германна :)