Народ, мне нужно написать о разнице в контроле типов в етих двух языках, где лутше... где хуже, чем ето лутше, чем хуже... выскажыте свои мнения об етом! Спасибо!
Vitaliy_www пишет: > Народ, мне нужно написать о разнице в контроле типов в етих двух языках, > где лутше... где хуже, чем ето лутше, чем хуже... выскажыте свои мнения > об етом! Спасибо!
Они одинаковые. Оба строго типизированные языки.
Вот не помню только, есть ли в Паскале RTTI.
По идее, должно быть, как же борланда, да без RTTI.
А кстати, Vitaliy, вы какой Object Pascal имеете в виду ?
Из два вообще-то. Борландовый и апловский.
Здравствуйте, Vitaliy_www, Вы писали:
V_>Народ, мне нужно написать о разнице в контроле типов в етих двух языках, где лутше... где хуже, чем ето лутше, чем хуже... выскажыте свои мнения об етом! Спасибо!
Если идёт речь о неуправляемом Object Pascal, то всё просто: уровень контроля типов одинаковый. Оба языка проверяют типы во время компиляции, имеют средства динамического приведения типов с проверкой и средства динамического приведения без проверки.
Здравствуйте, MasterZiv, Вы писали:
MZ>Vitaliy_www пишет: >> Народ, мне нужно написать о разнице в контроле типов в етих двух языках, >> где лутше... где хуже, чем ето лутше, чем хуже... выскажыте свои мнения >> об етом! Спасибо!
MZ>Они одинаковые. Оба строго типизированные языки. MZ>Вот не помню только, есть ли в Паскале RTTI. MZ>По идее, должно быть, как же борланда, да без RTTI.
MZ>А кстати, Vitaliy, вы какой Object Pascal имеете в виду ? MZ>Из два вообще-то. Борландовый и апловский.
По поводу строгой типизации Object Pascal-a (бормановского)
есть функция FreeAndNil(obj: TObject) так вот она легко примет на вход и Pointer (любой) и как не странно String — о какой жесткой типизации (по крайней мере бормановской реализации) можно говорить?
Здравствуйте, vasmann, Вы писали:
V>Здравствуйте, MasterZiv, Вы писали:
MZ>>Vitaliy_www пишет: >>> Народ, мне нужно написать о разнице в контроле типов в етих двух языках, >>> где лутше... где хуже, чем ето лутше, чем хуже... выскажыте свои мнения >>> об етом! Спасибо!
MZ>>Они одинаковые. Оба строго типизированные языки. MZ>>Вот не помню только, есть ли в Паскале RTTI. MZ>>По идее, должно быть, как же борланда, да без RTTI.
MZ>>А кстати, Vitaliy, вы какой Object Pascal имеете в виду ? MZ>>Из два вообще-то. Борландовый и апловский.
V>По поводу строгой типизации Object Pascal-a (бормановского) V>есть функция FreeAndNil(obj: TObject) так вот она легко примет на вход и Pointer (любой) и как не странно String — о какой жесткой типизации (по крайней мере бормановской реализации) можно говорить?
И в добавок компилер не то чтобы ворнинг на худой конец сказать, он даже хинта не скажет.
vasmann пишет: > По поводу строгой типизации Object Pascal-a (бормановского) > есть функция FreeAndNil(obj: TObject) так вот она легко примет на вход и > Pointer (любой) и как не странно String — о какой жесткой типизации (по > крайней мере бормановской реализации) можно говорить?
У них все объекты наследуются принудительно и неявно от TObject.
Так что все в порядке ( с точки зрения борладна ).
V>По поводу строгой типизации Object Pascal-a (бормановского) V>есть функция FreeAndNil(obj: TObject) так вот она легко примет на вход и Pointer (любой) и как не странно String — о какой жесткой типизации (по крайней мере бормановской реализации) можно говорить?
На C++ тоже можно наваять аналогичную FreeAndNil. Это уже проблемы не языка, а библиотеки.
Здравствуйте, MasterZiv, Вы писали:
MZ>vasmann пишет: >> По поводу строгой типизации Object Pascal-a (бормановского) >> есть функция FreeAndNil(obj: TObject) так вот она легко примет на вход и >> Pointer (любой) и как не странно String — о какой жесткой типизации (по >> крайней мере бормановской реализации) можно говорить?
MZ>У них все объекты наследуются принудительно и неявно от TObject. MZ>Так что все в порядке ( с точки зрения борладна ).
Шутить изволите?
String это не TObject
Pointer — это не TObject
Элементарное подтверждение — отработатйе функцию FreeAndNil на обьекте этого типа и вы получите такой Undefined Behavior!
MZ>У них все объекты наследуются принудительно и неявно от TObject. MZ>Так что все в порядке ( с точки зрения борладна ).
Pointer может указывать на всё что угодно, не обязательно на объект. FreeAndNil эти pointer-ы принимает за милую душу. Здесь конечно борланды накосячили, могли бы добавить поддержку FreeAndNil в компилятор, чтобы давал варнинги или ошибки.
V>>По поводу строгой типизации Object Pascal-a (бормановского) V>>есть функция FreeAndNil(obj: TObject) так вот она легко примет на вход и Pointer (любой) и как не странно String — о какой жесткой типизации (по крайней мере бормановской реализации) можно говорить? SS>На C++ тоже можно наваять аналогичную FreeAndNil. Это уже проблемы не языка, а библиотеки.
Буду признателен за пример
Требования
Есть иерархия классов, пусть наследванных от
class Object
{
virtual ~Object()
{
}
};
И сделать так (без reinterpret_cast-ов) чтобы эта функция приняла как char*, void*, так и Object* при этом чтобы вызвался деструктор Object, хотя тут проще, достаточно просто вызвать delete но в любом случае то что описал я НИКАК НЕ ПЛЮС Object Pascal от бормана (кстати он давно официально называется Делфи)
Еще пусть есть функция proceudre(const obj: TMyObject);
и у этого самого TMyObject есть функция котороя может модифицировать внтуреннее состояние обьекта, так вот вы ее вызовите и тоже не получите банального ворнинга, не говоря уже о С++ отказе компилить этот бред.
Здравствуйте, Vitaliy_www, Вы писали:
V_>Меня интересует именно сравнение с DELPHI, и интересно нащет RTTI в ДЕЛФИ..,
RTTI в Delphi более подробное. Почти как reflection для .net, но только для published свойств.
V_>Также там есть разница насколько я знаю в присвоениях указателей..
Интерсно, какая же разница?
Здравствуйте, SuhanovSergey, Вы писали:
SS>Здравствуйте, Vitaliy_www, Вы писали:
V_>>Меня интересует именно сравнение с DELPHI, и интересно нащет RTTI в ДЕЛФИ.., SS>RTTI в Delphi более подробное. Почти как reflection для .net, но только для published свойств.
V_>>Также там есть разница насколько я знаю в присвоениях указателей.. SS>Интерсно, какая же разница?
В С++ указатели можно напрямую присваивать, а в Делфи как то через Pointer..
Здравствуйте, Vitaliy_www, Вы писали:
V_>Здравствуйте, SuhanovSergey, Вы писали:
SS>>Здравствуйте, Vitaliy_www, Вы писали:
V_>>>Меня интересует именно сравнение с DELPHI, и интересно нащет RTTI в ДЕЛФИ.., SS>>RTTI в Delphi более подробное. Почти как reflection для .net, но только для published свойств.
V_>>>Также там есть разница насколько я знаю в присвоениях указателей.. SS>>Интерсно, какая же разница?
V_>В С++ указатели можно напрямую присваивать, а в Делфи как то через Pointer..
В С++ присвоить указатели разных типов куда сложнее чем в Делфи и это минус Делфи и + С++!!!!
V>И сделать так (без reinterpret_cast-ов) чтобы эта функция приняла как char*, void*, так и Object* при этом чтобы вызвался деструктор Object
Без reinterpret_cast-ов (и C-style-cast-ов) никак. Бормандовская FreeAndNil использует паскалевский reinterpret_cast:
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj); // тут
Pointer(Obj) := nil; // и тут
Temp.Free;
end;
V>Еще пусть есть функция proceudre(const obj: TMyObject); V>и у этого самого TMyObject есть функция котороя может модифицировать внтуреннее состояние
Да, в паскале нет обоих понятий: "константный указатель" и "указательнь на константу". Есть поддержка только первого понятия. По моему, это не относится к контролю типов. В .net вообще нет константности, при этом контроль типов в нём на высоте.
А вообще я согласен, что FreeAndNil и ограниченная поддержка константности — это минусы Delphi.
Здравствуйте, vasmann, Вы писали:
V>Здравствуйте, Vitaliy_www, Вы писали:
V_>>Здравствуйте, SuhanovSergey, Вы писали:
SS>>>Здравствуйте, Vitaliy_www, Вы писали:
V_>>>>Меня интересует именно сравнение с DELPHI, и интересно нащет RTTI в ДЕЛФИ.., SS>>>RTTI в Delphi более подробное. Почти как reflection для .net, но только для published свойств.
V_>>>>Также там есть разница насколько я знаю в присвоениях указателей.. SS>>>Интерсно, какая же разница?
V_>>В С++ указатели можно напрямую присваивать, а в Делфи как то через Pointer.. V>В С++ присвоить указатели разных типов куда сложнее чем в Делфи и это минус Делфи и + С++!!!!
Я был бы очень признателен если написали бы несколько примеров типа присвоение указателей на с++, и на Делфи. А то я об етом только поверхносно знаю..
V_>>В С++ указатели можно напрямую присваивать, а в Делфи как то через Pointer.. V>В С++ присвоить указатели разных типов куда сложнее чем в Делфи и это минус Делфи и + С++!!!!
Не вижу принципиальной разницы:
// C++
A* a;
void* p;
V>>И сделать так (без reinterpret_cast-ов) чтобы эта функция приняла как char*, void*, так и Object* при этом чтобы вызвался деструктор Object SS>Без reinterpret_cast-ов (и C-style-cast-ов) никак. Бормандовская FreeAndNil использует паскалевский reinterpret_cast:
SS>procedure FreeAndNil(var Obj); SS>var SS> Temp: TObject; SS>begin SS> Temp := TObject(Obj); // тут SS> Pointer(Obj) := nil; // и тут SS> Temp.Free; SS>end;
V>>Еще пусть есть функция proceudre(const obj: TMyObject); V>>и у этого самого TMyObject есть функция котороя может модифицировать внтуреннее состояние SS>Да, в паскале нет обоих понятий: "константный указатель" и "указательнь на константу". Есть поддержка только первого понятия. По моему, это не относится к контролю типов. В .net вообще нет константности, при этом контроль типов в нём на высоте. SS>А вообще я согласен, что FreeAndNil и ограниченная поддержка константности — это минусы Delphi.
Да виноват, думал что функция FreeAndNil описана как procedure FreeAndNil(var obj: TObject) и чего то не совсем понятно почему так и не сделали.
Но в любом случае помимо миносов с константами не нормально (с моей точки зрения) что TObject без дополнительных усилий програмера приведится к TObject-у и наоборот. Я считю, что не должно быть чего то неявного (уж такой неявности точно не нужно), что если хочешь привести тип — сделай это сам, а еще чтобы это было не так уж просто (достаточно просто), но и приводило бы к тому что бы вы задумались — а нужно ли здесь приведение?