Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 154 155 [156] 157 158 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2327
,
|
|
|
|
Цитата Астарот @ А? Та ладно, проехали... а то и так уже тролим.. |
|
Сообщ.
#2328
,
|
|
|
|
Это проверка стиля. Отступы, пробелы, одинаковое написание идентификаторов... Скажем, открываем любой проект, выбираем в опциях Switches -> Ada -> Style Checks все, что хочется, и проверяем семантику:
Прикреплённая картинка
Все, что желтое - не прошло проверку... А нужно - чтоб не было разнобоя в исходниках... |
|
Сообщ.
#2329
,
|
|
|
|
Цитата volvo877 @ Это проверка стиля. Отступы, пробелы, одинаковое написание идентификаторов... Скажем, открываем любой проект, выбираем в опциях Switches -> Ada -> Style Checks все, что хочется, и проверяем семантику: Прикреплённая картинка
Все, что желтое - не прошло проверку... А нужно - чтоб не было разнобоя в исходниках...ну я б не стал называть это семантической проверкой, проверка стилистики по сути =) |
|
Сообщ.
#2330
,
|
|
|
|
Цитата DesweR @ Только высказывания бредовые, мол, "одноимённые методы разных интерфейсов обязаны стать один и тем же методом, а если нет, то либо авторы интерфейсов индусы, либо я индус".Почему не дошла? Я и Корвин уже высказывались по этому поводу (в принципе добавлять и нечего), но тебя куда понесло... Давай не надо. Плюсы имеют то же поведение. Ты как обычно либо не дочитал того, на что я дважды обратил внимание, либо не понял и постеснялся спросить. Цитата DesweR @ Гм. Цитат под носом не хватает? Напомню, изначально разговор зашёл заВнезапно! Я пришёл к выводу, что выполнятся должен не только сигнатурный контракт класса и интерфейса, но и семантический (лукавлю конечно, этот вывод выводится в книге "Сущность технологии COM"). Не знаю кто там с пеной у рта, только вот не надо за меня решать, как я думал и думаю. Цитата Shaggy @ Я удивился и попросил разъяснений:child наследник parent и оба классы класс А наследник child процедура test принимающая в качестве параметра parent передаём в test экземпляр A, компилируется? а теперь то же самое для delphi, только child и parent интерфейсы результат: incompatible types Цитата Qraizer @ Ты начал возражать мне А почему, кстати? Не в смысле языка, а в смысле логики. ... Теперь если A реализует интерфейс child, почему это он при этом не реализует и интерфейс parent? Иначе с какой стати incompatible types? :Цитата DesweR @ Это отчасти вытекает из идеологии COM'а, ... Тоже самое касается и наследования интерфейсов, должен соблюдаться не только сигнатурный контракт, но и гарантированно семантический, а для этого класс A, должен содержать реализацию интерфейсов и child и parent. Что я неправильно "за тебя додумал"? Или "...класс A, должен содержать реализацию интерфейсов и child и parent" как раз и надо понимать "...что результат: incompatible types"? |
|
Сообщ.
#2331
,
|
|
|
|
korvin, быстренько набросал на коленке. Да, от кортежей тут почти ничего, получился какой-то compile-time array. Заодно добавил run-time индексирование, вдруг номер элемента придётся вычислять по ходу дела. Сорри за некоторую сумбурность, надеюсь, будет однако понятно.
![]() ![]() #include <cstdlib> #include <sstream> #include <string> #include <stdexcept> #include <iostream> /* Присвоение порядкового номера элементу */ template <typename T, size_t N> struct Item: T {}; /* Создание дерева элементов */ template <typename T, size_t N> struct GenerateTree: Item<T, N>, GenerateTree<T, N-1> { typedef Item<T, N> item_type; // для compile-time индексирования T& operator[](size_t i) // для run-time индексирования { return i == N ? static_cast<typename GenerateTree<T, N >::item_type&>(*this) : static_cast< GenerateTree<T, N-1>& >(*this)[i]; } }; /* Последний элемент в дереве */ template <typename T> struct GenerateTree<T, 0>: Item<T, 0> { typedef Item<T, 0> item_type; // для compile-time индексирования T& operator[](size_t i) // для run-time индексирования { if (i == 0) return *this; throw std::range_error(static_cast<std::ostringstream&>( std::ostringstream() << i << ": index is out of range" ).str()); } }; /* Контейнер */ template <typename T, size_t N> struct Tuple: GenerateTree<T, N-1> { template <size_t I> T& field() // для compile-time индексирования { return static_cast<typename GenerateTree<T, I>::item_type&>(*this); } T& operator[](size_t i) // для run-time индексирования { return static_cast<GenerateTree<T, N-1>&>(*this)[i]; } }; /* Контейнер длиной 0 недопустим */ template <typename T> struct Tuple<T, 0>; /* Тест */ /* твой класс */ class X { int num; public: int get() const { return num; } void set(int x) { num = x; } }; int main() { /* делаем 4 элемента */ Tuple<X, 4> tuple; /* compile-time индексирование */ tuple.field<0>().set(123); tuple.field<1>().set(321); tuple.field<2>().set(456); tuple.field<3>().set(978); std::cout << tuple.field<0>().get() << ' ' << tuple.field<1>().get() << ' ' << tuple.field<2>().get() << ' ' << tuple.field<3>().get() << std::endl; /* run-time индексирование */ tuple[0].set(321); tuple[1].set(123); tuple[2].set(654); tuple[3].set(789); std::cout << tuple[0].get() << ' ' << tuple[1].get() << ' ' << tuple[2].get() << ' ' << tuple[3].get() << std::endl; } |
|
Сообщ.
#2332
,
|
|
|
|
Цитата Qraizer @ Только высказывания бредовые, мол, "одноимённые методы разных интерфейсов обязаны стать один и тем же методом, а если нет, то либо авторы интерфейсов индусы, либо я индус". Концептуально в этом нет ничего странного. Если угодно, можно провести аналогия с концептами... То есть ты описываешь лишь контракт, поэтому если имя одно и контракт один, то значит и метод один. А вот для абстрактных классов это уже не справедливо. Добавлено Цитата Qraizer @ Тут всё открыто, поэтому достать элементы отдельно от контейнера не составляет труда. Я так понял, что korvin'а это не устраивает. А вот вариант на Ада подошел... Цитата А будет перегрузка точки? Не слышал о таком(в смысле именно по новому стандарту, сама возможность фигурирует в некоторых книгах, и в D&E тоже упоминается, если не ошибаюсь). Можно подробнее? Могу сказать, что это легко решаемо в новом Стандарте путём перегрузки точки. То же относится и к коду MyNameIsIgor-я, так что "хаков" с auto или ссылками можно не опасаться. |
|
Сообщ.
#2333
,
|
|
|
|
D_KEY, я не о логике программиста. Я о логике компилятора. Видишь ли, контракт интерфейсы как раз и описывают. Мне кажется гораздо более разумным по дефолту кричать о неоднозначности, если компилятор увидит методы с одинаковыми сигнатурами в более чем одном интерфейсе, как раз потому, что раз интерфейсы независимы, то и контракты у них разные. А коли так, то класс, реализующий оба интерфейса, должен выдерживать оба контракта, и единый метод одновременно для всех коллизируемых - это редкая ситуация.
Добавлено Не уверен, в общем-то. У меня старый драфт нового Стандарта. Там ещё нет. Но слухи ходят, и появились они после того, как я качнул драфт. |
|
Сообщ.
#2334
,
|
|
|
|
Но у тебя же не вызывает опасения схожая ситуация, возникающая при обобщенном программировании:
![]() ![]() template<typename T> void f(const T &obj) { //... return obj.mf(); } template<typename T> void g(const T &obj) { //... return obj.mf(); } Можно сказать, что тут для обоих функций неявно объявлен "интерфейс", состоящий из метода "void mf() const". И любая сущность, которая обеспечивает этот интерфейс(точнее предоставляет такой метод), может быть передана в любую из этих функций или в обе вместе. |
|
Сообщ.
#2335
,
|
|
|
|
Тут не вызывает. Они используются по отдельности. При совмещении в единый объект тоже будет вызывать.
|
|
Сообщ.
#2336
,
|
|
|
|
Цитата Qraizer @ Тут не вызывает. Они используются по отдельности. При совмещении в единый объект тоже будет вызывать. В смысле? Ты в классе определяешь метод ![]() ![]() class MyObj { public: //... void mf() const { //... } //... }; И передаешь в обе функции: ![]() ![]() MyObj obj; //... f(obj); g(obj); Компилятор никакой неоднозначности не видит(и в случае концептов тоже не увидит). Ты считаешь, что должен? Почему же для интерфейсов, работающих в рантайме(тот же пример, но функции требуют интерфейс, а MyObj явно указывает, что он принадлежит к обоим), он должен ругаться? В случае абстрактных классов, описывающих какое-то четкое понятие(пусть и абстрактное ), твое мнение понятно и я его разделяю. |
|
Сообщ.
#2337
,
|
|
|
|
D_KEY, хм... оформи свои доводы не кодом, а документацией. Уверен, увидишь разницу.
|
|
Сообщ.
#2338
,
|
|
|
|
Цитата Qraizer @ D_KEY, хм... оформи свои доводы не кодом, а документацией. Уверен, увидишь разницу. Разница лишь в явном или неявном задании интерфейса. Разве нет? |
|
Сообщ.
#2339
,
|
|
|
|
D_KEY, тут метод, подходящий под сигнатуру один, выбирать не из чего. А там два. Какой из них правильней, как выбирать?
|
|
Сообщ.
#2340
,
|
|
|
|
Цитата Adil @ D_KEY, тут метод, подходящий под сигнатуру один, выбирать не из чего. А там два. Какой из них правильней, как выбирать? Так обсуждается вопрос о том, является ли два метода, обладающие одинаковым именем и имеющие одинаковую сигнатуру, из разных "интерфейсов" одним и тем же методом. Я не понимаю, почему в статике(шаблоны и концепты) должно быть одно поведение(один метод), а в динамике(интерфейсы) должно быть другое(два метода и конфликт)? Напомню, что речь не об абстрактных классах и множественном наследовании. |