Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 179 180 [181] 182 183 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2701
,
|
|
|
|
Цитата IL_Agent @ А в каком языке объект, созданный из типа base внезапно превращается в один из его наследников? Ну а для чего я тогда иерархию строил, метод виртуальным объявлял ? И почему он вместо полиморфизма молча делает приведение типа, хотя я никаких операторов приведения не определял ? Добавлено Цитата IL_Agent @ Грабли, это когда на один синтаксис существует 2 семантики. Вот это действительно надо знать. Я это знаю. Проблема в том, что это грабли, на которые даже знающий человек может наступить. |
|
Сообщ.
#2702
,
|
|
|
|
Я не увидел ничего стоящего в его словах и пояснил ему глубину его заблуждения. Цитата IL_Agent @ Компилятор проглотил мой пример и не поперхнулся. Значит синтаксически я написал всё верно. Синтаксически - да. Но с чего вы взяли, что семантика написанного будет та, которую вы хотите видеть? Ах, да, у вас же Вы где этот смысл взяли? Выбросьте немедленно, он какой-то не такой... Правильный здравый смысл велит сначала ознакомиться с инструментом, а потом его использовать. А кто вас знает? Ну, смею надеяться, что анализ предметной области сказал о такой необходимости... Цитата IL_Agent @ И почему он вместо полиморфизма молча делает приведение типа, хотя я никаких операторов приведения не определял ? Как это? Ссылка на наследника может быть приведена к ссылке на публичного родителя - это тоже надо знать, ага. В соответствии с этим был вызван конструктор копирования родителя - как вы и написали, передача по значению. Что ещё про C++ вам объяснить? Цитата IL_Agent @ Я это знаю. Проблема в том, что это грабли, на которые даже знающий человек может наступить. Знающий - не может. |
|
Сообщ.
#2703
,
|
|
|
|
Если в шарпе вместо ![]() ![]() class Base { } class Derived : Base { } class StaticMain { publiс static void Foo(Base b) { } public static void Main() { Base b = new Derived(); Foo(b); } } Написать (подсвечено красным) ![]() ![]() class Base { } class Derived : Base { } class StaticMain { publiс static void Foo(ref Base b) { } public static void Main() { Base b = new Derived(); Foo(b); } } Тип перестаёт быть конкретным? |
|
Сообщ.
#2704
,
|
|
|
|
Цитата MyNameIsIgor @ Я не увидел ничего стоящего в его словах и пояснил ему глубину его заблуждения. нет, не пояснил. отличия сугубо семантические. синтаксическими они были бы, если бы, например, в яве нужно было явно описывать передачу по ссылке, но выглядело бы это как ![]() ![]() void func (ref Base x) { ... } |
|
Сообщ.
#2705
,
|
|
|
|
С удивлением обнаружил, что в C# нет метаклассов
|
|
Сообщ.
#2706
,
|
|
|
|
Цитата DesweR @ Расстроился наверное. С удивлением обнаружил, что в C# нет метаклассов ![]() |
|
Сообщ.
#2707
,
|
|
|
|
Цитата Повстанець @ Расстроился наверное. За них да, писать им фабрики Добавлено Хотя у них это рефлексией обходится, только вот контроль типов будет в рантайме. |
|
Сообщ.
#2708
,
|
|
|
|
Цитата MyNameIsIgor @ Правильный здравый смысл велит сначала ознакомиться с инструментом, а потом его использовать. Конечно. Но для пользования С++ "ознакомление" ничего не даст (как, например, ознакомление со Scheme в SICP). Надо зазубрить кучу всего, что "надо знать", потом наступить на множество граблей и только потом уже работать, продолжая наступать на грабли, но уже меньше, ибо опыт. |
|
Сообщ.
#2709
,
|
|
|
|
Цитата MyNameIsIgor @ Разверните мысль, пока что я не вижу никакого участия системы типов. Я вижу только различия в передачи ссылки и значения. имеем: ![]() ![]() void func (Base x) { x.method() } Derived x func(x) получаем: ![]() ![]() func = fun { params = { x = { type = Base; data = NIL } } type = void body = ... } d = var { type = Derived data = ... } передача по значению 1: ![]() ![]() apply func (b): when { b.type == f.params.x.type: f.params.x.data = copy b.data as b.type; b.type is f.params.x.type: f.params.x.data = copy b.data as f.params.x.type; else error TypeCheckFailed } do func.body } передача по значению 2: ![]() ![]() apply func (b): when { b.type is f.params.x.type: f.params.x.data = copy b.data else error TypeCheckFailed } let f.params.x.type = b.type in do func.body } Добавлено т.е в первом случае неявное преобразование при копировании, во втором локальное переписывание метки типа |
|
Сообщ.
#2710
,
|
|
|
|
Цитата korvin @ нет, не пояснил. отличия сугубо семантические. Лол? Смеяться надо? Я где-то говорил, что отличия синтаксические? Наоборот, я сказал, что одна и та же запись в плюсах и яве означает разные вещи. korvin, простите, я не имею желания разбирать ваше узелковое письмо, для которого даже подсветки нет. Вы поясните при чём тут система типов или так и будете "иметь" и "получать"? Цитата IL_Agent @ Конечно. Но для пользования С++ "ознакомление" ничего не даст (как, например, ознакомление со Scheme в SICP). Надо зазубрить кучу всего, что "надо знать", потом наступить на множество граблей и только потом уже работать, продолжая наступать на грабли, но уже меньше, ибо опыт. Да, в плюсах много чего надо знать. Только как из этого следует, что в кривом коде виноват язык, а не программист - не понимаю. |
|
Сообщ.
#2711
,
|
|
|
|
Цитата Flex Ferrum @ Тип перестаёт быть конкретным? Нет конечно. Причём тут это и твоя синтаксически неверная конструкция ? |
|
Сообщ.
#2712
,
|
|
|
|
Вот если бы было так, недоразумений было бы меньше...
Цитата void Func(Base& b) { b.Method(); } int main() { Derive d; Func(&d); } |
|
Сообщ.
#2713
,
|
|
|
|
Цитата IL_Agent @ Причём тут это и твоя синтаксически неверная конструкция ? Ну, на компиляемость не проверял. Пытался выразить идею передачи class'а по ссылке. С синтаксисом мог налажать, давно на шарпе не писал. Цитата IL_Agent @ Нет конечно. Вот и в случае C++ не перестаёт. Добавлено Цитата DesweR @ Вот если бы было так, недоразумений было бы меньше... От вот я вас таки умоляю. Тем более, что префиксный & имеет в C++ конкретную семантику. Да и в паскале/делфи не предусмотрено никаких специальных конструкций для передачи аргументов, принимаемых функцией как var. |
|
Сообщ.
#2714
,
|
|
|
|
Цитата MyNameIsIgor @ Да, в плюсах много чего надо знать. Только как из этого следует, что в кривом коде виноват язык, а не программист - не понимаю. Никак не следует. Я это и не утверждаю. Инструменты бывают разные, как хорошие, годные, так и кривые, убогие. А за работу отвечает работник, это да... |
|
Сообщ.
#2715
,
|
|
|
|
Цитата IL_Agent @ Никак не следует. Я это и не утверждаю. Инструменты бывают разные, как хорошие, годные, так и кривые, убогие. А за работу отвечает работник, это да... Так и отвечайте. Написали "передать по значению родителя" - так вам и было сделано. Разрешили копирование полиморфного класса - он и скопировался. |