![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
saneea |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 13.7.2005 Репутация: нет Всего: 0 |
Пишу курсовой, и будет у меня там много стеков работающих с разными типами. Можно конечно каждый отдельно описать, но за такое "по головке никто не погладит". Вот я и думаю, как это грамотно организовать. Помогите пожалста с примерчиком и проясните как это называеться: полиморфизм или абстракция?
|
|||
|
||||
saneea |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 13.7.2005 Репутация: нет Всего: 0 |
У меня вот есть одна догадка:
Но мне кажеться что это не совсем грамотно... хочу полиморфизм... ![]() |
|||
|
||||
MaXL |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 24.10.2005 Где: Владивосток Репутация: нет Всего: 2 |
saneea, а почему это не является грамотным то ?=) Вроде бы всё нормально, и не прийдётся ни классы описывать, ни методы, и при этом для разных типов разные.
-------------------- MaXL |
|||
|
||||
volvo877 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2073 Регистрация: 15.11.2004 Репутация: 14 Всего: 116 |
||||
|
||||
MaXL |
|
||||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 24.10.2005 Где: Владивосток Репутация: нет Всего: 2 |
volvo877, мне почему то кажется, что в этом предложении именно говориться, что будет несколько стэков, которые и будут хранить разные типы данных, т.е. один для строк, другой для чисел, третий ещё для чего-нибудь там. А в вашем примере о том, что либо стэк, либо о том, что кривой код, либо о том, что стэк должен сам из '10' преобразовать в 10. Т.е. мы ведь знаем, какой стэк используем(т.е. для каких данных он создан), таким и пользуемся:
-------------------- MaXL |
||||
|
|||||
volvo877 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2073 Регистрация: 15.11.2004 Репутация: 14 Всего: 116 |
А если ты соизволишь прочитать внимательно, то увидишь, что я имел в виду: грамотно построенный стек должен выдать ошибку на том примере, который я привел, а не выполнять его, поскольку стек должен хранить ИЛИ строки, ИЛИ целые, но никак не одно и другое вместе!
|
|||
|
||||
saneea |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 13.7.2005 Репутация: нет Всего: 0 |
Да, именно так. Хочу сделать один базовый класс для всех типов данных, а от него родить ещё к примеру один класс для целых, а другой для строк. Просто очень хочеться это сделать грамотно... Помогите пожааалста... Это сообщение отредактировал(а) saneea - 22.4.2008, 15:38 |
|||
|
||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
saneea, тогда в базовом классе стека храни указатели на данные, а в наследниках только приводи к нужному тебе типу.
-------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
MaXL |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 24.10.2005 Где: Владивосток Репутация: нет Всего: 2 |
volvo877, ну так я и говорю, что если создать стэк, в котором будут только числа к примеру, и если мы попытаемся туда запихать строку, то это просто кривой код будет...
-------------------- MaXL |
|||
|
||||
volvo877 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2073 Регистрация: 15.11.2004 Репутация: 14 Всего: 116 |
Это возможности простого стека, а не ГРАМОТНОГО, пойми ты это!!! Вообще-то Стек должен в Compile-Time предотвращать попытки занесения "чужого" типа. Почему ты не описываешь всегда у процедур/функций, которыми пользуешься, бестиповые параметры? Ты ж и так знаешь, что передавать, а? И не ошибаешься никогда, верно? Так передавай в бестиповый, а внутри уже приводи к тому типу, что тебе нужен. Ан нет, тебе, как видно, удобнее, чтобы происходила доп. проверка на совместимость типа, что ж ты тут-то советуешь неизвестно что?
|
|||
|
||||
saneea |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 13.7.2005 Репутация: нет Всего: 0 |
А можно пример? А то я не совсем понимаю как привести к нужному типу... |
|||
|
||||
volvo877 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2073 Регистрация: 15.11.2004 Репутация: 14 Всего: 116 |
saneea, ты PM читал?
|
|||
|
||||
saneea |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 13.7.2005 Репутация: нет Всего: 0 |
Что такое РМ? |
|||
|
||||
volvo877 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2073 Регистрация: 15.11.2004 Репутация: 14 Всего: 116 |
Личное сообщение, у тебя есть ссылка вверху страницы "... новых писем"
|
|||
|
||||
MaXL |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 24.10.2005 Где: Владивосток Репутация: нет Всего: 2 |
volvo877, я просто говорю, что в данном случае проще пользоваться именно такой структурой.
saneea, выложишь потом код, с реализацией всех этих стэков и мы сравним. -------------------- MaXL |
|||
|
||||
Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Я, в принципе соглашусь с volvo877, незачем в стек пихать все подрят. Но раз тебе именно этого хочется, то грамотно будет сделать интерфейс, который должен будет реализовывать каждый элемент, который может быть добавлен в стек, а стек уже должен работать с каждым элементом через этот интерфейс. В этом случае для простых типов придется делать обертки (классы). Но это позволит тебе избежать сложного дерева наследования, если вдруг у тебя действительно с сильно разными элементами надо работать. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
saneea |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 13.7.2005 Репутация: нет Всего: 0 |
Ого... Чесно говоря я думал всё это по проще... Есть ещё одна идея, но для этого мне нужно знать, можно ли объявить тип, который будет виден только в этом классе. Тогда можно будет создать класс, в котором объявить тип TType=variant (к примеру), сделать все операции с этим относительно этого типа(относительно TType), а в классах предках просто переопределять этот тип (к примеру TType=integer или TType=string). Можно определить тип в классе?
|
|||
|
||||
MaXL |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 24.10.2005 Где: Владивосток Репутация: нет Всего: 2 |
saneea, ну вроде бы как можно, скорее всего так:
-------------------- MaXL |
|||
|
||||
Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
А обратно из Variant ты как будешь переводить? Как ты определишь в рантайме, какой именно у тебя тип на самом деле?
Так ты проще хотел или грамотно? ![]() Относительно типа не получится. Отностиельно базового класса или интерфеса - можно. В предках ничего переопределить нельзя, можно только в потомках переопределить что-то. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
saneea |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 13.7.2005 Репутация: нет Всего: 0 |
Да, я об этом уже подумал...
Я хотел и то и другое ![]() Я помню мы ещё на первом курсе проходили C++, и было там такая вещь как шаблоны. Только это кажется далеко не полиморфизм. |
||||
|
|||||
Esperito |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 2.9.2007 Репутация: 1 Всего: 3 |
Можно сделать стек, содержащий Variant'ы, при создании конструктору передавать желаемый тип (например vtInteger), а потом запрещать процедуре Push принимать любой другой тип Variant'а.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |