Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полиморфный (или абстрактный) стек 
:(
    Опции темы
saneea
Дата 21.4.2008, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 13.7.2005

Репутация: нет
Всего: 0



Пишу курсовой, и будет у меня там много стеков работающих с разными типами. Можно конечно каждый отдельно описать, но за такое "по головке никто не погладит". Вот я и думаю, как это грамотно организовать. Помогите пожалста с примерчиком и проясните как это называеться: полиморфизм или абстракция?
PM MAIL   Вверх
saneea
Дата 21.4.2008, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 13.7.2005

Репутация: нет
Всего: 0



У меня вот есть одна догадка:

Код

TStack=class
tab: array [1..10] of variant;
up: integer;
procedure push(x: variant);
function pop: variant;
constructor Create;
end;

procedure TStack.push(x: variant);
begin
inc(up);
tab[up]:=x;
end;

function TStack.pop: variant;
begin
pop:=tab[up];
dec(up);
end;

constructor TStack.Create;
begin
up:=0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
st:=TStack.Create;
end;


Но мне кажеться что это не совсем грамотно... хочу полиморфизм...  smile 
PM MAIL   Вверх
MaXL
Дата 22.4.2008, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



saneea, а почему это не является грамотным то ?=) Вроде бы всё нормально, и не прийдётся ни классы описывать, ни методы, и при этом для разных типов разные.


--------------------
MaXL
PM MAIL   Вверх
volvo877
Дата 22.4.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



Цитата(MaXL @  22.4.2008,  08:18 Найти цитируемый пост)
а почему это не является грамотным то ?=)
Хотя бы потому, что
Код

var stack: TStack
...
  stack.push(10);
  stack.push('20');
...
будет пропущено, а грамотная реализация стека должна работать только с однотипными данными...

PM MAIL   Вверх
MaXL
Дата 22.4.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Цитата
у меня там много стеков работающих с разными типами


volvo877, мне почему то кажется, что в этом предложении именно говориться, что будет несколько стэков, которые и будут хранить разные типы данных, т.е. один для строк, другой для чисел, третий ещё для чего-нибудь там. А в вашем примере о том, что либо стэк, либо о том, что кривой код, либо о том, что стэк должен сам из '10' преобразовать в 10.
Т.е. мы ведь знаем, какой стэк используем(т.е. для каких данных он создан), таким и пользуемся:
Код

var stack: TStack
...
  stack.push(10);
  stack.push(StrToInt('20')); //до кучи просто ;-)
...



--------------------
MaXL
PM MAIL   Вверх
volvo877
Дата 22.4.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



А если ты соизволишь прочитать внимательно, то увидишь, что я имел в виду: грамотно построенный стек должен выдать ошибку на том примере, который я привел, а не выполнять его, поскольку стек должен хранить ИЛИ строки, ИЛИ целые, но никак не одно и другое вместе! 
PM MAIL   Вверх
saneea
Дата 22.4.2008, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 13.7.2005

Репутация: нет
Всего: 0



Цитата(volvo877 @ 22.4.2008,  14:25)
А если ты соизволишь прочитать внимательно, то увидишь, что я имел в виду: грамотно построенный стек должен выдать ошибку на том примере, который я привел, а не выполнять его, поскольку стек должен хранить ИЛИ строки, ИЛИ целые, но никак не одно и другое вместе!

Да, именно так. Хочу сделать один базовый класс для всех типов данных, а от него родить ещё к примеру один класс для целых, а другой для строк. Просто очень хочеться это сделать грамотно...

Помогите пожааалста...

Это сообщение отредактировал(а) saneea - 22.4.2008, 15:38
PM MAIL   Вверх
Rennigth
Дата 22.4.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



saneea, тогда в базовом классе стека храни указатели на данные, а в наследниках только приводи к нужному тебе типу. 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
MaXL
Дата 22.4.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



volvo877, ну так я и говорю, что если создать стэк, в котором будут только числа к примеру, и если мы попытаемся туда запихать строку, то это просто кривой код будет...
Код

var 
  intStack: TStack;
  //...
  stack.push('12');
  //...



--------------------
MaXL
PM MAIL   Вверх
volvo877
Дата 22.4.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



Это возможности простого стека, а не ГРАМОТНОГО, пойми ты это!!! Вообще-то Стек должен в Compile-Time предотвращать попытки занесения "чужого" типа. Почему ты не описываешь всегда у процедур/функций, которыми пользуешься, бестиповые параметры? Ты ж и так знаешь, что передавать, а? И не ошибаешься никогда, верно? Так передавай в бестиповый, а внутри уже приводи к тому типу, что тебе нужен. Ан нет, тебе, как видно,  удобнее, чтобы происходила доп. проверка на совместимость типа, что ж ты тут-то советуешь неизвестно что?
PM MAIL   Вверх
saneea
Дата 22.4.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 13.7.2005

Репутация: нет
Всего: 0



Цитата(Rennigth @ 22.4.2008,  15:55)
saneea, тогда в базовом классе стека храни указатели на данные, а в наследниках только приводи к нужному тебе типу.

А можно пример? А то я не совсем понимаю как привести к нужному типу...
PM MAIL   Вверх
volvo877
Дата 22.4.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



saneea, ты PM читал?

PM MAIL   Вверх
saneea
Дата 22.4.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 13.7.2005

Репутация: нет
Всего: 0



Цитата(volvo877 @ 22.4.2008,  16:32)
saneea, ты PM читал?

Что такое РМ?
PM MAIL   Вверх
volvo877
Дата 22.4.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



Личное сообщение, у тебя есть ссылка вверху страницы "... новых писем"
PM MAIL   Вверх
MaXL
Дата 23.4.2008, 05:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



volvo877, я просто говорю, что в данном случае проще пользоваться именно такой структурой.
saneea, выложишь потом код, с реализацией всех этих стэков и мы сравним.


--------------------
MaXL
PM MAIL   Вверх
Felan
Дата 23.4.2008, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Цитата(saneea @  22.4.2008,  17:36 Найти цитируемый пост)
Да, именно так. Хочу сделать один базовый класс для всех типов данных, а от него родить ещё к примеру один класс для целых, а другой для строк. Просто очень хочеться это сделать грамотно...

Я, в принципе соглашусь с volvo877, незачем в стек пихать все подрят. Но раз тебе именно этого хочется, то грамотно будет сделать интерфейс, который должен будет реализовывать каждый элемент, который может быть добавлен в стек, а стек уже должен работать с каждым элементом через этот интерфейс. В этом случае для простых типов придется делать обертки (классы).
Но это позволит тебе избежать сложного дерева наследования, если вдруг у тебя действительно с сильно разными элементами надо работать.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
saneea
Дата 23.4.2008, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 13.7.2005

Репутация: нет
Всего: 0



Ого... Чесно говоря я думал всё это по проще... Есть ещё одна идея, но для этого мне нужно знать, можно ли объявить тип, который будет виден только в этом классе. Тогда можно будет создать класс, в котором объявить тип TType=variant (к примеру), сделать все операции с этим относительно этого типа(относительно TType), а в классах предках просто переопределять этот тип (к примеру TType=integer или TType=string). Можно определить тип в классе?
PM MAIL   Вверх
MaXL
Дата 24.4.2008, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



saneea, ну вроде бы как можно, скорее всего так:
Код

TStack = class
    type
      TType = Variant;
    private
      Stack: array[0..MAX_STACK] of TType;
      StackPos: integer;
    public
      procedure Push(Value: TType);
      function Pop: TType;
  end;



--------------------
MaXL
PM MAIL   Вверх
Felan
Дата 24.4.2008, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



А обратно из Variant ты как будешь переводить? Как ты определишь в рантайме, какой именно у тебя тип на самом деле?

Цитата(saneea @  23.4.2008,  21:18 Найти цитируемый пост)
Ого... Чесно говоря я думал всё это по проще...

Так ты проще хотел или грамотно? smile

Цитата(saneea @  23.4.2008,  21:18 Найти цитируемый пост)
сделать все операции с этим относительно этого типа(относительно TType), а в классах предках просто переопределять этот тип (к примеру TType=integer или TType=string)

Относительно типа не получится. Отностиельно базового класса или интерфеса - можно. В предках ничего переопределить нельзя, можно только в потомках переопределить что-то.



--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
saneea
Дата 24.4.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 13.7.2005

Репутация: нет
Всего: 0



Цитата

А обратно из Variant ты как будешь переводить? Как ты определишь в рантайме, какой именно у тебя тип на самом деле?


Да, я об этом уже подумал...

Цитата

Так ты проще хотел или грамотно? smile 

Я хотел и то и другое smile

Я помню мы ещё на первом курсе проходили C++, и было там такая вещь как шаблоны. Только это кажется далеко не полиморфизм.
PM MAIL   Вверх
Esperito
Дата 24.4.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: 1
Всего: 3



Можно сделать стек, содержащий Variant'ы, при создании конструктору передавать желаемый тип (например vtInteger), а потом запрещать процедуре Push принимать любой другой тип Variant'а.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0994 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.