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/ |