Автор Тема: Ассоциативный контейнер в оберонах  (Прочитано 39796 раз)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Ассоциативный контейнер в оберонах
« Ответ #45 : Апрель 06, 2012, 05:30:08 pm »
Множественное наследование всегда можно сделать вручную (как в C ;)
Object.QueryInterface() - и вперед.
Приведи на Обероне реализацию, плиз. Object.QueryInterface это ж вроде как ни разу не Си, это С++.

Все наследуется от базового Object, у которого есть перегружаемый QueryInterface. Допустим у наc есть объект Object -> Drawable и его надо положить в контейнер, который хочет Object -> Hashable:
1. Реализуем свой Object -> Hashable -> MyHashable, в котом есть ссылка на оригинальный Object -> Drawable
2. У MyHashable реализуем QueryInterface, который умеет возвращать оригинальный Object -> Drawable.
3. Кладем в контейнер.
4. Когда надо вытащить из контейнера и получить оригинальный Object -> Drawable: вытаскиваем Hashable, вызываем у него QueryInterface, кастим результат к Drawable.

Все просто :) Только закат солнца вручную ;)

P.S. В С++ оно не надо - там есть dynamic_cast, который замечательно работает с множественным наследованием.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Ассоциативный контейнер в оберонах
« Ответ #46 : Апрель 06, 2012, 05:39:58 pm »
Приведи на Обероне реализацию, плиз. Object.QueryInterface это ж вроде как ни разу не Си, это С++.

Тут еще интересно, что использовать в качестве аргумента QueryInterface. Ручками назначать каждому интерфейсу идентификатор - это вообще ужос-ужос, так что без очередного расширизма не обойтись ;)

DIzer

  • Гость
Re: Ассоциативный контейнер в оберонах
« Ответ #47 : Апрель 06, 2012, 05:58:58 pm »

Все наследуется от базового Object, у которого есть перегружаемый QueryInterface. Допустим у наc есть объект Object -> Drawable и его надо положить в контейнер, который хочет Object -> Hashable:

Наверно тяжелый день... не врубаюсь в смысл употребляемого слова - наследование (вроде в СИ его нет), разумеется эту ситуацию можно смоделировать низкоуровневыми
средствами( других нет   :) ) - вы это имеете ввиду?

Madzi

  • Jr. Member
  • **
  • Сообщений: 86
    • Просмотр профиля
Re: Ассоциативный контейнер в оберонах
« Ответ #48 : Апрель 06, 2012, 06:57:18 pm »
Ярослав Романченко, некоторое время назад, выкладывал пример с контейнерами в А2 (обероны) на oberonCore. А я его немного развил

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Ассоциативный контейнер в оберонах
« Ответ #49 : Апрель 06, 2012, 07:04:38 pm »
Ярослав Романченко, некоторое время назад, выкладывал пример с контейнерами в А2 (обероны) на oberonCore. А я его немного развил
На сколько я помню, там был тихий, типонебезопасный, ужас.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Ассоциативный контейнер в оберонах
« Ответ #50 : Апрель 06, 2012, 07:37:40 pm »
Ярослав Романченко, некоторое время назад, выкладывал пример с контейнерами в А2 (обероны) на oberonCore. А я его немного развил
На сколько я помню, там был тихий, типонебезопасный, ужас.
А что означает  "типонебезопасный"?

Madzi

  • Jr. Member
  • **
  • Сообщений: 86
    • Просмотр профиля
Re: Ассоциативный контейнер в оберонах
« Ответ #51 : Апрель 06, 2012, 07:43:57 pm »
Не было там никакого ужаса. Там был кастиг типов, и чтобы от него избавится я предложил свой вариант. В котором уже совсем нет приведения типов.

DIzer

  • Гость
Re: Ассоциативный контейнер в оберонах
« Ответ #52 : Апрель 06, 2012, 07:54:32 pm »
Не было там никакого ужаса. Там был кастиг типов, и чтобы от него избавится я предложил свой вариант. В котором уже совсем нет приведения типов.
А вот это может быть ужасом - если используется внутри контейнера... при определенный обстоятельствах... сборщик мусора может взять и посчитать ссылки хранящиеся в контейнере инвалидными... иными словами обьекты выпадают из поля зрения GK -ужас если речь идет об этом.
« Последнее редактирование: Апрель 06, 2012, 07:56:31 pm от DIzer »

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Ассоциативный контейнер в оберонах
« Ответ #53 : Апрель 06, 2012, 08:02:00 pm »
Не было там никакого ужаса. Там был кастиг типов, и чтобы от него избавится я предложил свой вариант. В котором уже совсем нет приведения типов.
А ты пробовал собирать тот код который у тебя там выложен?

Мне откровенно не понятно каким образом соберется вот это:
Цитировать
PROCEDURE TestList*();
VAR
   list : ArrayList; (* можно заменить на LinkedList *)
   long : Longint;
BEGIN
   NEW(list);
   ASSERT(list # NIL);
 
   NEW(long);
   long^.value := 13;
 
   list.Add(long);
   long := NIL;
 
   KernelLog.String("List size: ");
   KernelLog.Int(list.Size(), 4);
   KernelLog.Ln();
 
   long := list.Get(0);
 
   KernelLog.String("Element value: ");
   KernelLog.Int(long^.value);
   KernelLog.Ln();
END TestList;

Тип возвращаемого значения Get - ListItem, а Longint - это потомок ListItem'a (Longint* = POINTER TO RECORD(ListItem);). Следовательно необходим апкастинг.

Кроме того, в этот ArrayList я могу положить не только LongInt а все что угодно другое унаследованное от ListItem'a, следовательно при апкастинге при доставании вылетит исключение во время исполнения приложения. Это и есть - не типобезопасно.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Ассоциативный контейнер в оберонах
« Ответ #54 : Апрель 06, 2012, 08:14:43 pm »
а что в Активе нет is,  as?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Ассоциативный контейнер в оберонах
« Ответ #55 : Апрель 06, 2012, 08:23:26 pm »
а что в Активе нет is,  as?
И is и as это приведение типов (апкастинг в данном случае). Если в списке будет лежать что-то не то, будет ошибка в рантайме. Её конечно можно обработать, но от этого не легче. Нет типобезопасности.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Ассоциативный контейнер в оберонах
« Ответ #56 : Апрель 06, 2012, 08:24:52 pm »
я это к чему - ну ошибка - она же в конечном примере...а не в реализации библиотеки.

DIzer

  • Гость
Re: Ассоциативный контейнер в оберонах
« Ответ #57 : Апрель 06, 2012, 08:27:53 pm »
а что в Активе нет is,  as?
И is и as это приведение типов (апкастинг в данном случае). Если в списке будет лежать что-то не то, будет ошибка в рантайме. Её конечно можно обработать, но от этого не легче. Нет типобезопасности.
Что означает не то? -не потомок пустой записи? а как он туда попадет - где дырка в интерфейсе?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Ассоциативный контейнер в оберонах
« Ответ #58 : Апрель 06, 2012, 08:44:35 pm »
Что означает не то? -не потомок пустой записи? а как он туда попадет - где дырка в интерфейсе?
Означает что был у меня список int'ов, а какой-то гад туда окошко положил. И то и другое потомок ListItem'a, но при доставании у меня ВНЕЗАПНО случится не то что я хочу.

Это собственно ровно то, из за чего в java были введены (с версии 1.5) дженерики. Они делают контейнеры типобезопасными (на производительность в жабе это в общем то не влияет).
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Ассоциативный контейнер в оберонах
« Ответ #59 : Апрель 06, 2012, 08:56:13 pm »
Что означает не то? -не потомок пустой записи? а как он туда попадет - где дырка в интерфейсе?
Означает что был у меня список int'ов, а какой-то гад туда окошко положил. И то и другое потомок ListItem'a, но при доставании у меня ВНЕЗАПНО случится не то что я хочу.

Это собственно ровно то, из за чего в java были введены (с версии 1.5) дженерики. Они делают контейнеры типобезопасными (на производительность в жабе это в общем то не влияет).
Алексей.... я считаю , что это не проблема ДАННОЙ реализации контейнера- обобщенка работающая чисто на наследовании имеет такой изьян, хотя можно пропихнуть кастомную CheckType(oblPtr:PEmptyPtr):BOOLEAN  и потребовать ее реализацию при создании экземпляра коллекции  - чтобы вылетело при попытке запихнуть что-то не то.... но это из другой оперы...