| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Полиморфный (или абстрактный) стек |
| Автор: saneea 21.4.2008, 23:32 |
| Пишу курсовой, и будет у меня там много стеков работающих с разными типами. Можно конечно каждый отдельно описать, но за такое "по головке никто не погладит". Вот я и думаю, как это грамотно организовать. Помогите пожалста с примерчиком и проясните как это называеться: полиморфизм или абстракция? |
| Автор: saneea 21.4.2008, 23:54 | ||
У меня вот есть одна догадка:
Но мне кажеться что это не совсем грамотно... хочу полиморфизм... |
| Автор: MaXL 22.4.2008, 09:18 |
| saneea, а почему это не является грамотным то ?=) Вроде бы всё нормально, и не прийдётся ни классы описывать, ни методы, и при этом для разных типов разные. |
| Автор: volvo877 22.4.2008, 11:29 | ||
Хотя бы потому, что
|
| Автор: MaXL 22.4.2008, 13:37 | ||||
volvo877, мне почему то кажется, что в этом предложении именно говориться, что будет несколько стэков, которые и будут хранить разные типы данных, т.е. один для строк, другой для чисел, третий ещё для чего-нибудь там. А в вашем примере о том, что либо стэк, либо о том, что кривой код, либо о том, что стэк должен сам из '10' преобразовать в 10. Т.е. мы ведь знаем, какой стэк используем(т.е. для каких данных он создан), таким и пользуемся:
|
| Автор: volvo877 22.4.2008, 14:25 |
| А если ты соизволишь прочитать внимательно, то увидишь, что я имел в виду: грамотно построенный стек должен выдать ошибку на том примере, который я привел, а не выполнять его, поскольку стек должен хранить ИЛИ строки, ИЛИ целые, но никак не одно и другое вместе! |
| Автор: saneea 22.4.2008, 15:36 | ||
Да, именно так. Хочу сделать один базовый класс для всех типов данных, а от него родить ещё к примеру один класс для целых, а другой для строк. Просто очень хочеться это сделать грамотно... Помогите пожааалста... |
| Автор: Rennigth 22.4.2008, 15:55 |
| saneea, тогда в базовом классе стека храни указатели на данные, а в наследниках только приводи к нужному тебе типу. |
| Автор: MaXL 22.4.2008, 16:14 | ||
volvo877, ну так я и говорю, что если создать стэк, в котором будут только числа к примеру, и если мы попытаемся туда запихать строку, то это просто кривой код будет...
|
| Автор: volvo877 22.4.2008, 16:30 |
| Это возможности простого стека, а не ГРАМОТНОГО, пойми ты это!!! Вообще-то Стек должен в Compile-Time предотвращать попытки занесения "чужого" типа. Почему ты не описываешь всегда у процедур/функций, которыми пользуешься, бестиповые параметры? Ты ж и так знаешь, что передавать, а? И не ошибаешься никогда, верно? Так передавай в бестиповый, а внутри уже приводи к тому типу, что тебе нужен. Ан нет, тебе, как видно, удобнее, чтобы происходила доп. проверка на совместимость типа, что ж ты тут-то советуешь неизвестно что? |
| Автор: saneea 22.4.2008, 16:31 | ||
А можно пример? А то я не совсем понимаю как привести к нужному типу... |
| Автор: volvo877 22.4.2008, 16:32 |
| saneea, ты PM читал? |
| Автор: saneea 22.4.2008, 19:30 | ||
Что такое РМ? |
| Автор: volvo877 22.4.2008, 20:36 |
| Личное сообщение, у тебя есть ссылка вверху страницы "... новых писем" |
| Автор: MaXL 23.4.2008, 05:34 |
| volvo877, я просто говорю, что в данном случае проще пользоваться именно такой структурой. saneea, выложишь потом код, с реализацией всех этих стэков и мы сравним. |
| Автор: saneea 23.4.2008, 19:18 |
| Ого... Чесно говоря я думал всё это по проще... Есть ещё одна идея, но для этого мне нужно знать, можно ли объявить тип, который будет виден только в этом классе. Тогда можно будет создать класс, в котором объявить тип TType=variant (к примеру), сделать все операции с этим относительно этого типа(относительно TType), а в классах предках просто переопределять этот тип (к примеру TType=integer или TType=string). Можно определить тип в классе? |
| Автор: MaXL 24.4.2008, 07:04 | ||
saneea, ну вроде бы как можно, скорее всего так:
|
| Автор: Felan 24.4.2008, 09:17 | ||
| А обратно из Variant ты как будешь переводить? Как ты определишь в рантайме, какой именно у тебя тип на самом деле? Так ты проще хотел или грамотно?
Относительно типа не получится. Отностиельно базового класса или интерфеса - можно. В предках ничего переопределить нельзя, можно только в потомках переопределить что-то. |
| Автор: saneea 24.4.2008, 12:41 | ||||
Да, я об этом уже подумал...
Я хотел и то и другое Я помню мы ещё на первом курсе проходили C++, и было там такая вещь как шаблоны. Только это кажется далеко не полиморфизм. |
| Автор: Esperito 24.4.2008, 16:35 |
| Можно сделать стек, содержащий Variant'ы, при создании конструктору передавать желаемый тип (например vtInteger), а потом запрещать процедуре Push принимать любой другой тип Variant'а. |