OberonCore
https://forum.oberoncore.ru/

Сюрпризы в BlackBox: Потерянная реализация метода
https://forum.oberoncore.ru/viewtopic.php?f=29&t=39
Страница 1 из 1

Автор:  Сергей Губанов [ Среда, 30 Ноябрь, 2005 00:29 ]
Заголовок сообщения:  Сюрпризы в BlackBox: Потерянная реализация метода

Сюрпризы в 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 ]
Заголовок сообщения: 

Ну не совсем баг, но тоже интересно:

Код:
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 ]
Заголовок сообщения: 

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


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

Автор:  Сергей Губанов [ Среда, 30 Ноябрь, 2005 13:38 ]
Заголовок сообщения: 

Код:
  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 ]
Заголовок сообщения: 

Насчет Interface из контекстного меню: команда эта находится в модуле DevBrowser, и у нее есть много режимов. Так что можно получить все, чего хочется, просто переписав меню под себя. Вообще-то, в ББ есть много команд полезных, которые просто не вынесены в меню. Например, DevSearch - для поиска по всем исходникам. В документации все это описано.

Автор:  Trurl [ Среда, 30 Ноябрь, 2005 17:55 ]
Заголовок сообщения: 

А разве это принципиально отличается от такого?
Код:
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 ]
Заголовок сообщения: 

Trurl писал(а):
А разве это принципиально отличается от такого?


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

Автор:  Иван Горячев [ Четверг, 01 Декабрь, 2005 01:27 ]
Заголовок сообщения: 

Trurl писал(а):
А разве это принципиально отличается от такого?


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

Автор:  batyrmastyr [ Воскресенье, 29 Апрель, 2007 22:24 ]
Заголовок сообщения: 

Ivor писал(а):
Абстрактные методы по идее должны всегда быть экспортируемыми. Либо компилятор должен делать проверку на незавершённые скрытые методы и ругаться.

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/