Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 183 184 [185] 186 187 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2762
,
|
|
|
|
А в C# всё-таки требуется обязательное указание ключевого слова ref при передаче ссылки.
![]() ![]() void Method(ref int i) { } ... int val = 1; Method(ref val); Добавлено Цитата trainer @ Про написание чего? Предполагаю, что чего-нибудь аналогично похожего, что есть в бусте. |
|
Сообщ.
#2763
,
|
|
|
|
Цитата DesweR @ Ну если оно есть в бусте, значит хотя бы один человек такое уже написал. А если написал один, то понятное дело напишет и второй. Логично ведь... Предполагаю, что чего-нибудь аналогично похожего, что есть в бусте. |
|
Сообщ.
#2764
,
|
|
|
|
нет, не получает, она получает ссылку на реализацию (я не зря использовал это слово) Derived, но с интерфейсом Base. При передаче по значению (тут ява да, неудачный пример) также сужается только интерфейс. |
|
Сообщ.
#2765
,
|
|
|
|
Цитата Flex Ferrum @ Правильно ли я понимаю, что для полиморфных и неполиморфных типов компилятор должен реализовывать разную семантику? Первые всегда должны быть ссылочные, а вторые - by value. А разработчику (как конечному, так и компилятора) голову не снесёт? Вот разработчики Delphi нашли в себе смелость сделать наследуемым ссылочный тип, и не наследуемым структурный, по значению. Отказавшись от старой системы объектов by value. Много ты видел дельфистов и шарпистов со снесенными головами? И только сишники продолжают цепляться за безнадежно устаревшую систему реализации объектов, при этом утверждая, что все хорошо и так и должно быть, а другие способы - полный отстой.Программирование идет на абстракциях, они могут быть удичными или нет. string - абстракция строки, причем в Delphi она на мой взгляд наиболее удачная. В частности, начинающие программисты просто и не догадываются, что это ссылка, а воспринимают это как должно: абстракция строки. То же самое касается и объектов. Везде и постоянно говорится, что внутреннее устройство объектов необходимо скрывать, пользователь не должен знать как устроен объект внутри, и использовать это. И только некоторые личности уверяют, что им просто необходимо знать и постоянно указывать как идет работа с объектом, иначе голову снесет. |
|
Сообщ.
#2766
,
|
|
|
|
Цитата korvin @ нет, не получает, она получает ссылку на реализацию (я не зря использовал это слово) Derived, но с интерфейсом Base Ну, да, это и называется приведением ссылки на потомка к ссылке на предка. Например, C# ![]() ![]() using System; class Base { public void foo() { Console.WriteLine("Base"); } public virtual void bar() { Console.WriteLine("Base"); } } class Derived : Base { public new void foo() { Console.WriteLine("Derived"); } public override void bar() { Console.WriteLine("Derived"); } } class Program { public static void f(Base b) { b.foo(); b.bar(); } public static void Main(string[] args) { var d = new Derived(); f(d); } } ![]() ![]() Base Derived Наличие виртуального метода - частность, никак не влияющая на приведение ссылки. |
|
Сообщ.
#2767
,
|
|
|
|
Цитата Romkin @ Не поверишь! std::string - абстракция строки, не все даже не-начинающие знают, как оно внутри устроено - это просто не нужно. Более того, возможны и наверняка существуют реализации с разным внутренним устройством. Мне лень сравнивать реализации, например, RogueWave и STLPort. В частности, начинающие программисты просто и не догадываются, что это ссылка, а воспринимают это как должно: абстракция строки. Добавлено Как-то странно выглядит выдача нормы за преимущество Delphi. |
|
Сообщ.
#2768
,
|
|
|
|
Цитата trainer @ Не поверишь! std::string - абстракция строки, не все даже не-начинающие знают, как оно внутри устроено - это просто не нужно. Вот именно. А зачем тогда вам интересно указывать, что это ссылка или нет? Добавлено Цитата trainer @ Как-то странно выглядит выдача нормы за преимущество Delphi. Потому что это именно норма. А программисты С++ хотят явного указания, ссылка это или нет. Зачем? |
|
Сообщ.
#2769
,
|
|
|
|
Цитата Romkin @ Так мы при обобщенном программировании и не интересуемся, как оно внутри устроено. Нужно ли создавать руками копию или нет? А зачем тогда вам интересно указывать, что это ссылка или нет? Добавлено Цитата Romkin @ Чтобы знать, как с этим работать. Ведь поведение переменной/параметра зависит от типа. А программисты С++ хотят явного указания, ссылка это или нет. Зачем? |
|
Сообщ.
#2770
,
|
|
|
|
Цитата trainer @ Даже больше скажу. Во время написания оно может быть ещё вообще ни как не устроено. Так мы при обобщенном программировании и не интересуемся, как оно внутри устроено. И как будет устроено представлять только в общих чертах. |
|
Сообщ.
#2771
,
|
|
|
|
Цитата MyNameIsIgor @ Цитата korvin @ нет, не получает, она получает ссылку на реализацию (я не зря использовал это слово) Derived, но с интерфейсом Base Ну, да, это и называется приведением ссылки на потомка к ссылке на предка. Например, C# ![]() ![]() using System; class Base { public void foo() { Console.WriteLine("Base"); } public virtual void bar() { Console.WriteLine("Base"); } } class Derived : Base { public new void foo() { Console.WriteLine("Derived"); } public override void bar() { Console.WriteLine("Derived"); } } class Program { public static void f(Base b) { b.foo(); b.bar(); } public static void Main(string[] args) { var d = new Derived(); f(d); } } ![]() ![]() Base Derived Наличие виртуального метода - частность, никак не влияющая на приведение ссылки. это называется приведение интерфейса ![]() ![]() class Base { public void method () { System.out.println( "Base" ); } } class Derived extends Base { private int = 0; public void setX (int x) { this.x = x; } public void method () { System.out.format( "Derived %s\n", x ); } } public class Test { static private Base func (Base x) { x.method(); ((Derived) x).setX(4); return x; } static public void main (String[] args) { Derived d = new Derived(); d.setX(3); d = (Derived) func(d); d.method(); } } ![]() ![]() Derived 3 Derived 4 как видишь к супертипу приводится только интерфейс (который легко можно привести обратно), реализация не приводится. Добавлено в случае с динамической типизацией приведения вообще не нужны |
|
Сообщ.
#2772
,
|
|
|
|
Цитата korvin @ как видишь к супертипу приводится только интерфейс (который легко можно привести обратно), реализация не приводится. Никогда не слышал понятия "приведение интерфейса". То, что вы показываете, - приведение типа. Тип в данном случае ссылочный. Это в какой-то степени соответствует приведению ссылок в C++ (что тоже является приведение типов). |
|
Сообщ.
#2773
,
|
|
|
|
Я о том, что интерфейс оказывается тоже ссылка узнал только когда на IDL описание увидел. В Delphi это знание просто не нужно, так зачем указывать звездочку, если иного не дано? Есть абстракция "объект", на ней определены некоторые действия, которые с ним можно производить. Присваивание (и некоторые другие действия) в их состав не входит. Все. С какой целью знать, что это ссылочный тип? Знать в принципе нужно, но это знание не должно быть необходимым. А в С++ знать отличие ссылки и значения - необходимо, потому что объект там по сути просто набор предков. Из-за этого приходится активно использовать шаблоны.
То есть реализация абстракции "объект" в С++ устарела уже лет на десять. Куча языков ушла вперед, абстракции объектов в java, C#, Delphi, Питоне и т.д. намного более удобны, именно как абстракции. В частности, сделана большая работа над тем, чтобы как можно меньше использовать указатели и ссылки, они спрятаны внутри абстракции. И сделано это недаром, тенденция "мы не работаем с указателями" уже совершенно ясна. И выпячивать отсталось С++ в этом вопросе как преимущество - глупо. Причем я уверен, что на практике по значению передаются объекты без виртуальных методов, и по ссылке - с виртуальными. То есть, скорее всего ограничение, которое есть в других языках на уровне языка, в С++ носит организационный характер. Все как обычно, если в других языках ты просто не можешь сделать неправильно, то в С++ - легко и непринужденно, при этом тебе заявляют что сам дурак, так делать не надо в свете последних решений съезда ведущих разработчиков... |
|
Сообщ.
#2774
,
|
|
|
|
Цитата trainer @ Про написание чего? Цитата DesweR @ Предполагаю, что чего-нибудь аналогично похожего, что есть в бусте. Вывод : КО не любит С++ и не подсказывает его сторонникам. Цитата Повстанець @ Ну если оно есть в бусте, значит хотя бы один человек такое уже написал. А если написал один, то понятное дело напишет и второй. ... Но не прочтёт то, что написал первый. |
|
Сообщ.
#2775
,
|
|
|
|
Цитата trainer @ А программисты С++ хотят явного указания, ссылка это или нет. Зачем? Чтобы знать, как с этим работать. Ведь поведение переменной/параметра зависит от типа. И что? Я тебе объявляю, что для этого типа присвоедине не приводит к появлению копии. Тебе очень интересно, реализовано это через ссылку или еще как? Есть абстракция, есть описанные действия с ней. Тебя не должно интересновать, ссылочный это тип или нет, это - детали реализации. Яркий пример как раз тип string в Delphi. Реализован через ссылку, но при программировании с ним программист это "забывает". Потому что этот факт не нужно знать. |