Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизИспользование полиморфных объектов Найти похожие ветки
← →
теркин © (2012-03-17 22:41) [0]Господа подскажите существует ли возможность получения значений дочерних классов по известному значению предка, без использования is и as. Приведу фрагмент кода
type TSy=class(Tobject)
....
TSyTrub=class(TSy)
.....
TSyPotrebitel=class(TSy)
...
Родительский класс используется в динамическом списке
TSyList = class(TList)
Хочется чтобы функция
function TSyList.GetItem(Index: Integer): TSy;
begin
Result := inherited Items[Index];
end;
возвращала значения наследников а не предков.
← →
Dimka Maslov © (2012-03-17 23:08) [1]В D7 - никак. В более новых версия - легко.
← →
RWolf © (2012-03-17 23:24) [2]вообще говоря, полиморфизм есть в любой версии дельфи и даже в борланд-паскале, равно как и в любом другом ООП -языке.
← →
теркин © (2012-03-17 23:32) [3]Возможность то есть при использовании is и as. При использовании is узнаем потомка а при помощи as приводим к нужному типу, просто для примера.
if result as TSyTrub then result as TSyTrub;
Конечно хорошо если потомков мало, а если 100 тогда код писать устанешь. Вот и подумал может кто нибудь знает как можно получить потомок без использования as и is, так сказать одним методом на всех зразу.
← →
теркин © (2012-03-17 23:34) [4]Пардон немного напортачил в коде
if result is TSyTrub then result as TSyTrub;
← →
Плохиш © (2012-03-18 00:10) [5]
> Родительский класс используется в динамическом списке
> TSyList = class(TList)
> Хочется чтобы функция
> function TSyList.GetItem(Index: Integer): TSy;
> begin
> Result := inherited Items[Index];
> end;
>
> возвращала значения наследников а не предков.
Интересно:
1. Нафига там стоит inherited?
2. Функция возвращает ссылку на экземпляр созданного класса, причём тут наследники и родители? Может стоит, в конце концов, с теорией ознакомиться? В справке к D7 всё прекрасно расписано.
← →
теркин © (2012-03-18 01:15) [6]
> Нафига там стоит inherited?
Базовый класс TObjectList описанный в стандартном модуле contnrs.pas содержит inherited для GetItem, а приведенный здесь TSyList = class(TList) это просто его небольшая модификация.
> Функция возвращает ссылку на экземпляр созданного класса
Понятно, что получим значение реально переданного объекта. Поставленный вопрос как получать значение свойств дочерних классов не во время работы программы, а во время написания кода, чтобы при обращении в свойству items он показывал не только значение родительского класса, но и любых других дочерних классов, без прямого приведения объектов с использованием as и is.
> Может стоит, в конце концов, с теорией ознакомиться?
Вот с ней как раз и знакомятся. Все что не понятно спрашивается на форуме.
> В справке к D7 всё прекрасно расписано
Справка ведь написана на английском. Ну не силен в языках, что ту поделаешь.
← →
Anatoly Podgoretsky © (2012-03-18 08:39) [7]> теркин (18.03.2012 01:15:06) [6]
Не силен в языках, не силен в программирование
← →
теркин © (2012-03-18 10:14) [8]
> Не силен в языках, не силен в программирование
Получается так что отсутствие знаний по высшей математики позволяет быть программистом? 21 раздел высшей математики. Сколько разделов надо знать что быть программистом? Незнание языка позволяет освоить какую то часть программирования допустим 100-200 процедур или стандартных объектов.Даже если не знаешь математику и знаешь все языки программирования наизусть, что то серьезное уже никогда не напишешь. Скорее всего по сравнению с Вами Anatoly Podgoretsky я полный дебил, но я точно знаю что есть программисты перед которыми Вы такой же дебил как я перед вами (не примите за грубость привел сравнение для примера - все относительно).
← →
Inovet © (2012-03-18 10:29) [9]> [8] теркин © (18.03.12 10:14)
Что за чушь ты пишешь. Тебе говорят, что без минимального умения читать хотя бы технические тексты на английском языке в программировании сложно что-то освоить. И это так и есть, поскольку бОльшая часть документации на английском. Как ты собрался что-то делать, не умея читать справку по используемому? А ты в обиды полез.
← →
CRLF (2012-03-18 10:41) [10]
> Что за чушь ты пишешь
http://lex-kravetski.livejournal.com/311121.html
← →
теркин © (2012-03-18 12:40) [11]
> А ты в обиды полез.
На полном серьезе никаких обид, учится не стыдно, стыдно не учится.
> поскольку бОльшая часть документации на английском
Почти вся документация на английском и это существенно тормозит процесс обучения, но сейчас в сети можно найти много документов на русском. Для решаемой задачи пока хватает книг Дарахвелидзе и Шумакова, которые с лихвой покрывает все требуемые практические вопросы. Поймите правильно вопросы задаются в единственной целью, понять есть такая возможность или её нет.Это позволяет экономить время. В приведенном выше описании классов есть возможность в списке TSyList описать функции items как overload которые будут возвращать дочерние классы, но если дочерних классов много, как быть?
← →
Юрий Зотов © (2012-03-18 14:11) [12]
> теркин © (18.03.12 12:40) [11]
Хорошо, давайте на русском. Даже "на пальцах".
Известно, что все жители квартиры N - Ивановы. Больше неизвестно ничего. Значит, если в эту квартиру позвонить, то дверь откроет Иванов. Прадед, дед, отец, сын, внук или правнук - неизвестно. Чтобы это определить нам, нужна какая-то дополнительная информация.
Ваш список - это квартира. Объекты в списке - Ивановы. Как же программа может сделать то, что не под силу даже человеку?
← →
теркин © (2012-03-18 14:57) [13]Получается ответ один - возможности такой нет, жалко конечно. Получается что добавить в список объекты наследники можно, извлекать их можно, но работать с наследниками "напрямую" в самом списке нет. Вот теперь все понятно.
Всем большое спасибо за потраченное время и нервы. Большие извинения Anatoly Podgoretsky за резкий тон, как говорят французы Pardon Mya. Юрию Зотову отдельные благодарности за объяснение существующего ограничения по применению списков.
← →
Inovet © (2012-03-18 15:04) [14]> [13] теркин © (18.03.12 14:57)
> Получается что добавить в список объекты наследники можно,
> извлекать их можно, но работать с наследниками "напрямую"
> в самом списке нет.
Есть. И имя этому - полиморфизм, реализация - виртуальные методы.
← →
теркин © (2012-03-18 15:33) [15]Для того чтобы мы перестали говорить на пальцах вод код объявления класса предка
{Базовый класс}
type TSy=class(Tobject)
private
AName:String;
AValue:Double;
procedure WriteValue(FValue:Double);
procedure Calcylate;virtual;abstract;
public
constructor Create(FName:String);
property Name:String read AName;
property Value:Double read AValue write WriteValue;
end;
Повторяю еще раз нет проблем с получением значений элементов списка со всеми его потомками во время выполнения программы. Проблема как получать описание дочерних объектов в списке во время написания кода.
← →
Юрий Зотов © (2012-03-18 16:34) [16]
> Inovet © (18.03.12 15:04) [14]
Если я правильно понял вопрос, автор хочет видеть свойства и методы потомков без приведения типов, да еще и в design-nime к тому же.
← →
Inovet © (2012-03-18 16:47) [17]> [16] Юрий Зотов © (18.03.12 16:34)
Перечитал вопрос ещё раз. Тогда это странное желание. Наверняка автор мыслит не в ту сторону: хочет одно, но делает другое.
← →
теркин © (2012-03-18 21:10) [18]
> Юрий Зотов
Вы все правильно поняли, и четко объяснили что это невозможно. Как говорится и рыбку есть и мимо проскакать не получится. Это дошла четко -спасибо объяснили.
← →
Юрий Зотов © (2012-03-18 21:25) [19]
> теркин © (18.03.12 21:10) [18]
В принципе, такое возможно, если написать свой код и внедрить его в IDE в виде эксперта (или набора экспертов). Только вряд ли кто станет это делать - потому что в данном случае овчинка явно не стоит выделки.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.06 c