![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Полиморфизм без наследования.
И. Павел © (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
Нет.