Текущий архив: 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