Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 178 179 [180] 181 182 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2686
,
|
|
|
|
|
Сообщ.
#2687
,
|
|
|
|
![]() ![]() [TestFixture] class Test { struct MyStruct { // Переопределяем неявно унаследованный ToString() public override String ToString() { return "Hello"; } } [Test] public void Ts() { var value = new MyStruct(); // Все структуры неявно наследуют ValueType. // Assert.That(value is ValueType, Is.True); Assert.That(value is Object, Is.True); // Пакуем. // По сути как в примере Flex Ferrum пользуемся ссылкой. ValueType valueType = value; Assert.That(valueType.ToString(), Is.EqualTo("Hello")); // Пример IL_Agent не релаизуется в C# потому, что запрещены иерархии структур. } } В ногу выстрелить не дадут. Добавлено А, нет, вру! ![]() ![]() struct Base { public override String ToString() { return "Base"; } } [Test] public void StructPolymorphism() { Base value = new Derivative(); Assert.That(value.ToString(), Is.EqualTo("Base")); } IL_Agent, C# тоже выводит "Base" |
|
Сообщ.
#2688
,
|
|
|
|
Цитата IL_Agent @ Собственно, вброс и был навеян этим обсуждением. С++ такой логичный Ну и, кончено же, всегда можно сказать : При использовании аргументов по значению происходит копирование. Чего уж тут нелогичного-то? |
|
Сообщ.
#2689
,
|
|
|
|
Red
Всё равно не понял (речь о классах или структурах?), т.е. вот такое на C# неужели не сработает? ![]() ![]() type TBase = class public procedure Method; virtual; end; TDerive = class(TBase) public procedure Method; override; end; procedure TBase.Method; begin ShowMessage('TBase'); end; procedure TDerive.Method; begin ShowMessage('TDerive'); end; procedure Func(B: TBase); begin B.Method; end; var D: TDerive; begin D := TDerive.Create; Func(D); end; ![]() ![]() TDerive |
|
Сообщ.
#2690
,
|
|
|
|
Цитата Red @ Assert.That(value.ToString(), Is.EqualTo("Base")); Ужас какой |
|
Сообщ.
#2691
,
|
|
|
|
Цитата Red @ Assert.That(value is ValueType, Is.True); Assert.That(value is Object, Is.True); Кстати, тут ассерты для красоты или? |
|
Сообщ.
#2692
,
|
|
|
|
Цитата korvin @ семантика не та, нет в яве такой семантики, чтобы при передаче экземпляра Derived в Func(Base), вызывался Base.method Гля... Так в том то и дело, что в Java передаётся не экземпляр, а ссылка на экземпляр. В плюсах передача по ссылке указывается явно. Цитата IL_Agent @ С++ такой логичный Да, логичный. То, что плюсы не соответствуют вашим представлениям о синтаксисе, не говорит, что он нелогичный. Вот вы, собственно, с чего решили, что написав ![]() ![]() void Func(Base b) вы будете работать с наследником Base? Где вы об этом прочитали? С чего вы это взяли? Вы с какого-то перепугу (не иначе большая собака рядом стояла) решили, что синтаксис должен совпадать с сисярпом. Вот и всё, что было. А что эта запись в шарпе ближе скорее к плюсовому ![]() ![]() void Func(Base& b) вы знать не хотите - вот и вся проблема. |
|
Сообщ.
#2693
,
|
|
|
|
Цитата Мяут-Настоящий @ Цитата Red @ Assert.That(value.ToString(), Is.EqualTo("Base")); Ужас какой ![]() В MSDN Magazine попадалась статья, где модульные тесты используют для исследования чего-то нового. Отличная идея! Гораздо удобнее вывода в консоль или выполнения под отладчиком. Если ты про то, как это выглядит синтаксически - так ведь же конструкция и звучит как предложение на английском. Assert that value is equal to "Base". В этом как раз весь смысл. Добавлено Цитата DesweR @ Цитата Red @ Assert.That(value is ValueType, Is.True); Assert.That(value is Object, Is.True); Кстати, тут ассерты для красоты или? Скрытый текст Цитата Сначала убедимся, что все мы на одной странице, и двинемся дальше. Давайте подойдем к MongoDB несколько более структурированно, чем в предыдущей статье (msdn.microsoft.com/magazine/ee310029). Вместо того чтобы просто написать элементарное приложение и забавляться с ним, убьем двух зайцев одним выстрелом и создадим исследовательские тесты: сегменты кода, похожие на модульные тесты, но позволяющие изучать функциональность, а не пытаться тестировать ее. Написание исследовательских тестов служит нескольким целям при изучении новой технологии. Во-первых, эти тесты помогают выяснить, присуща ли изучаемой технологии поддержка тестирования (если ее трудно тестировать в целях изучения, то же самое будет и при модульном тестировании — огромный красный флаг). Во-вторых, они служат своего рода регрессионными тестами в случае выпуска новой версии существующей технологии, так как позволяют заблаговременно узнать, что старая функциональность больше не работает. И в-третьих, поскольку тесты должны быть компактными и гранулярными, исследовательские тесты по самой своей природе облегчают изучение технологии за счет создания новых случаев «что если», которые строятся на основе предыдущих случаев. В отличие от модульных тестов исследовательские не разрабатываются непрерывно в процессе создания приложения, поэтому, как только вы изучили технологию, отложите эти тесты. Но не выбрасывайте их — они способны помочь в отделении ошибок приложения от ошибок в библиотеке или инфраструктуре. Это достигается тем, что такие тесты создают облегченную и нейтральную к приложению среду для экспериментов, свободную от генерируемых приложением издержек. http://msdn.microsoft.com/ru-ru/magazine/ff714592.aspx Вот эта идея мне очень понравилась! |
|
Сообщ.
#2694
,
|
|
|
|
Поведение указано IL_Agent'ом можно запретить используя явный конструктор копирования:
![]() ![]() #include<iostream> class Base { public: Base() {} explicit Base(const Base& b) {} virtual void Method() { std::cout<<"Base\n"; } }; class Derive:public Base { public: Derive() {} explicit Derive(const Derive& b) {} void Method() { std::cout<<"Derive\n"; } }; void f(Base b) { b.Method(); } void g(Base& b) { b.Method(); } int main() { Derive d; Base b(d); // OK // f(b); // Error g(b); // OK g(d); // OK } |
|
Сообщ.
#2695
,
|
|
|
|
Цитата MyNameIsIgor @ Так в том то и дело, что в Java передаётся не экземпляр, а ссылка на экземпляр. В плюсах передача по ссылке указывается явно. нет же, способ передачи совсем не причем, а причем система типов |
|
Сообщ.
#2696
,
|
|
|
|
Цитата korvin @ нет же, способ передачи совсем не причем, а причем система типов Какое отношение передача параметров имеет к системе типов? |
|
Сообщ.
#2697
,
|
|
|
|
Red
А что касательно моего примера в C#? |
|
Сообщ.
#2698
,
|
|
|
|
Прочитал на днях книжку по яве. Там про разницу передачи ссылочных и объектных типов трижды упоминается специально (в общем обзоре, конкретно при изучении классов и в краткой теории ООП с т.з. явы) и много-много раз в сносках и комментариях к коду, как бы напоминается. Наверное это от того, что мешанина из ссылочных и объектных типов настолько очевидна и логична.
|
|
Сообщ.
#2699
,
|
|
|
|
Цитата Red @ Поведение указано IL_Agent'ом можно запретить используя явный конструктор копирования Да там надо сначала сделать виртуальный деструктор у базового класса, а копирование, по-хорошему, вообще надо запретить... Цитата korvin @ нет же, способ передачи совсем не причем, а причем система типов Разверните мысль, пока что я не вижу никакого участия системы типов. Я вижу только различия в передачи ссылки и значения. Добавлено Цитата Повстанець @ Прочитал на днях книжку по яве. Там про разницу передачи ссылочных и объектных типов трижды упоминается специально (в общем обзоре, конкретно при изучении классов и в краткой теории ООП с т.з. явы) и много-много раз в сносках и комментариях к коду, как бы напоминается. Наверное это от того, что мешанина из ссылочных и объектных типов настолько очевидна и логична. ![]() Во-во. И квалификатор ref в шарпе, наверное, тоже существует от абсолютной логичности смешения разной семантики одинакового синтаксиса |
|
Сообщ.
#2700
,
|
|
|
|
Цитата MyNameIsIgor @ Да, логичный. То, что плюсы не соответствуют вашим представлениям о синтаксисе, не говорит, что он нелогичный. Речь не о синтаксисе, а о семантике, korvin уже писал же. Компилятор проглотил мой пример и не поперхнулся. Значит синтаксически я написал всё верно. И это не мои представления - это здравый смысл. Цитата MyNameIsIgor @ Вот вы, собственно, с чего решили, что написав void Func(Base b) вы будете работать с наследником Base? Ну а для чего я тогда иерархию строил, метод виртуальным объявлял ? И почему он вместо полиморфизма молча делает приведение типа, хотя я никаких операторов приведения не определял ? Цитата MyNameIsIgor @ А что эта запись в шарпе ближе скорее к плюсовому void Func(Base& b) вы знать не хотите - вот и вся проблема. Я это знаю. Проблема в том, что это грабли, на которые даже знающий человек может наступить. |