![]() |
|
| Правила Форума редакция от 22.06.2020 |
|
|||||||
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
|
Опции темы | Опции просмотра |
Language
|
|
|
#1
|
|
Постоялец
![]() ![]() Пол:
Регистрация: 17.02.2007
Адрес: Пенза
Сообщений: 240
Репутация: 29
|
Есть 2 разных объекта с похожими методами, например, O1:Type1 и O2:Type2 (напр., SqlDataset из вкладки DbExpress и Dbf стороннего разработчика)
O1.Add, O1.Value O2.Add, O2.Value Как передать в функцию параметр(-ы) с заранее неизвестным типом?Примерно так Funct(O: Type) O.Add() Result := O1.Value x := Funct(O1) x := Funct(O2) Понятно, что можно использовать overload Funct(O: Type1); overload Funct(O: Type2); overload Но это не выход - слишком много разнородных объектов по типам и количеству параметров может быть. Чувствую, что в направлении pointer копать надо. Но вот как? Заранее надеюсь на помощь PS Извините, если вопрос поднимался, но что-то после многочасового копания в Гугле так и не нашел. Вероятно, руки кривые :-) Последний раз редактировалось borispnz; 21.07.2010 в 08:23.. |
|
|
|
| Реклама: |
|
|
#2
|
|
Постоялец
![]() ![]() Пол:
Регистрация: 13.03.2008
Адрес: Минск
Сообщений: 257
Репутация: 231
|
А к примеру:
function TForm1.proba(o: TObject): boolean; begin // if o is TSQLDataSet then ShowMessage('Обрабатываем TSQLDataSet'); end;
__________________
|
|
|
|
|
|
#3
|
|||||||||||||||||||||||
|
Постоялец
![]() ![]() Пол:
Регистрация: 17.02.2007
Адрес: Пенза
Сообщений: 240
Репутация: 29
|
Т.е. потом писать нечто вроде if o is TSQLDataSet then (o as TSQLDataSet).value else if o is TDbfDataSet then (o as TDbfDataSet).value Так? И чем отличается от overload? И потом - что делать, если передается несколько параметров? Например, Sql и Dbf работают попеременно как источник, так и получатель. FunctToDbf(SqlSource, DbfTarget) FunctToSql(DbfSource, SqlTarget) Именно это примерно мой случай, только еще сложнее |
|||||||||||||||||||||||
|
|
|
|
|
#4
|
|||||||||||||||||||||||
|
Пользователь
Пол:
Регистрация: 23.08.2008
Адрес: Москва
Сообщений: 38
Репутация: 7
|
if (o1 is TSQLDataSet) and (o2 is TDbfDataSet) then FunctToDbf(SqlSource, DbfTarget) else if (o1 is TDbfDataSet) and (o2 is TSQLDataSet) then FunctToSql(DbfSource, SqlTarget) |
|||||||||||||||||||||||
|
|
|
|
|
#5
|
|
Неактивный пользователь
Пол:
Регистрация: 29.05.2007
Сообщений: 10
Репутация: 1
|
Если сами объекты однотипные (предок один), то зачем изврат?
В твоем примере: Funct(O: Type) O.Add() Result := O1.Value; Type - Предок обоих классов (только у предка тоже должен быть этот метод, а потомки его наследовать, и все у тебя получится, в случае датасетов - у них общий TDataset, так в функции и пиши: Function FCount(Dataset: TDataset) Begin Result := Dataset.Fields.Count; End; F1 := FCount(DbfDataset1); F2 := FCount(SQLDataset1); |
|
|
|
| Сказали спасибо: |
![]() |
Похожие темы
|
||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Нужно чуток доработать(изменить) функцию у скрипта (за деньги) | PairGain | Веб - Программирование | 0 | 18.02.2009 00:25 |
| Как вызвать функцию, которая присовена переменной | SaraTancredi | Java Script | 1 | 02.12.2008 13:43 |
| Помогите найти прогу имеющую функцию деформация | Факер | Просмотр, конверторы и редакторы графики | 6 | 15.04.2008 08:20 |
| как отключить функцию в (пуск-> документы...) | mna7421 | Windows XP | 5 | 06.04.2008 16:37 |
| Проблема тех. характера со многими играми | Amr | Помощь по играм | 5 | 10.09.2006 12:22 |
|
|