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

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

Полиморфизм без наследования.


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

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

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

Например:

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

F(Edit1)
F(DBLoockupComboBox1)
…


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

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


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

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


Германн   (2010-08-03 03:03:00) [2]

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


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

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

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

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

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


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

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

Только для published.


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


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

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


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

SetOrdProp


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


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

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

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


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

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

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


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


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

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


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

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


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

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

type
 TFriendControl = class(TControl);

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

F(Edit1);
F(DBLoockupComboBox1);


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

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

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

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

3. Хелперы.

4. [3] - Published и RTTI


Anatoly Podgoretsky   (2010-08-02 16:10:00) [13]

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

Published и RTTI


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


> [1] Amoeba_   (02.08.10 14:55)

Спасибо.


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

да


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


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

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


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

Нет.


Наверх

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