OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 20 Сентябрь, 2020 22:33

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 30 Ноябрь, 2005 00:29 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Сюрпризы в BlackBox: Потерянная реализация метода

Вы будете долго смеяться, но в Блэкбоксе есть вот такой глюк:
Код:
MODULE X;

  TYPE
    A = ABSTRACT RECORD END;
    B* = ABSTRACT RECORD (A) END;

  PROCEDURE (VAR this: A) Lost, NEW, ABSTRACT;
 
  PROCEDURE Call* (VAR a: A);
  BEGIN
    a.Lost
  END Call;

END X.


Код:
MODULE Y;

  IMPORT X;

  TYPE
    C* = RECORD (X.B) END;
 
  PROCEDURE Do*;
    VAR c: C;
  BEGIN
    X.Call(c)
  END Do;
   
END Y.

Всё прекрасно компилируется, ведь процедура A.Lost не экспортируется, поэтому тип C, о ней ничего не знает и компилятор не требует реализации процедуры Lost от типа C. При выполнении, естественно, обнаруживается ошибка "NIL procedure call".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 30 Ноябрь, 2005 01:36 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Ну не совсем баг, но тоже интересно:

Код:
MODULE ModA;
  TYPE
    Base = EXTENSIBLE RECORD
      field* : INTEGER;
    END;

    Type1* = RECORD(Base)
      field1* : INTEGER;
    END;
END ModA.


Если на это сказать "Interface" из контекстного меню, получим
Код:
DEFINITION ModA;
  TYPE
    Type1 = RECORD(Base)
      field1 : INTEGER;
    END;
END ModA.


А если "Client interface" из меню Info, то
Код:
DEFINITION ModA;
  TYPE
    Type1 = RECORD(Base)
      field : INTEGER;
      field1 : INTEGER;
    END;
END ModA.

Вообще логично, но иногда неудобно.

А что касается потерянного метода - это не баг компилятора, это баг языка. В описании не прописано поведение в конкретном случае. Этот же баг есть и в оригинальном Обероне(-1), но там нет абстрактных методов, поэтому он не так заметен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 30 Ноябрь, 2005 11:36 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Ivor писал(а):
Этот же баг есть и в оригинальном Обероне(-1), но там нет абстрактных методов, поэтому он не так заметен.


Ещё подумал - нет, в оригинальном Обероне (и в Оберон-2) такого бага нет. Это именно недоработка Компонентного Паскаля.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 30 Ноябрь, 2005 13:38 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Код:
  TYPE
    A = ABSTRACT RECORD END;
    B* = ABSTRACT RECORD (A) END;

Кстати, в .Net запрещено наследование от класса, чья область видимости ниже чем область видимости потомка.

Код:
namespace Namespace1
{
  internal class A
  {
  }
  public class B: A
  {
  }
}

Код:
class Module
{
  private class A
  {
  }
  internal class B: A
  {
  }
}

Build Error. Inconsistent accessibility: base class 'A' is less accessible than class 'B'.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 30 Ноябрь, 2005 14:26 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9281
Откуда: Россия, Орёл
Насчет Interface из контекстного меню: команда эта находится в модуле DevBrowser, и у нее есть много режимов. Так что можно получить все, чего хочется, просто переписав меню под себя. Вообще-то, в ББ есть много команд полезных, которые просто не вынесены в меню. Например, DevSearch - для поиска по всем исходникам. В документации все это описано.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 30 Ноябрь, 2005 17:55 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1298
А разве это принципиально отличается от такого?
Код:
MODULE X;
 TYPE
    A* =  RECORD
     p:POINTER TO SomeThing;
   END;
 
  PROCEDURE Call* (VAR a: A);
  VAR x:SomeThing;
  BEGIN
    x:=a.p
  END Call;
END X.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 30 Ноябрь, 2005 18:51 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Trurl писал(а):
А разве это принципиально отличается от такого?


Ну, принципиально-то не отличается: "Против глупости сами боги бороться бессильны".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 01 Декабрь, 2005 01:27 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Trurl писал(а):
А разве это принципиально отличается от такого?


Не знаю насколько принципиально, но отличается. Абстрактные методы по идее должны всегда быть экспортируемыми. Либо компилятор должен делать проверку на незавершённые скрытые методы и ругаться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 29 Апрель, 2007 22:24 

Зарегистрирован: Среда, 28 Февраль, 2007 00:08
Сообщения: 142
Откуда: Нижний Новгород
Ivor писал(а):
Абстрактные методы по идее должны всегда быть экспортируемыми. Либо компилятор должен делать проверку на незавершённые скрытые методы и ругаться.

Похоже "уничтожитель мусора" перестарался - увидев что метод никто не сможет вызвать напрямую, он его занулил. Еще один пункт описания который надо менять.
Сергей Губанов писал(а):
Кстати, в .Net запрещено наследование от класса, чья область видимости ниже чем область видимости потомка.
Оказывается, здесь тоже запрещено. В описании четко прописано:"Нельзя экспортировать тип записей, являющийся потомком скрытого (т.е. не экспортированного) типа записей" или в оригинале "A record which is an extension of a hidden (i.e., non-exported) record type may not be exported."


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2020, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB