Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 141 142 [143] 144 145 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2131
,
|
|
|
|
Цитата IL_Agent @ В C# это не так. При реализации придётся явно указать, от какого интерфейса взят метод. ![]() ![]() void InterfaceName.MethodName(int a) {...} т.е. нужно реализовывать два метода? А как выглядит вызов этих методов? |
|
Сообщ.
#2132
,
|
|
|
|
Цитата DesweR @ MyNameIsIgor А что у тебя выведется при таком варианте? ![]() ![]() var a: A; b: B; begin a := A.Create; a.f; b := B.Create; b.f; a := B.Create; a.f; end; Строго говоря, у класса B нет метода f. Можно рассмотреть такой код ![]() ![]() #include <iostream> class IA { public: virtual void f() = 0; }; class IB : public IA { public: virtual void g() = 0; }; class A : public IA { public: virtual void f() { std::cout << "A::f()" << std::endl; } }; class IB2 : public IB { void f() { IB_f(); } public: virtual void IB_f() = 0; }; class B : public A, public IB2 { public: virtual void g() { std::cout << "B::g()" <<std::endl; } virtual void IB_f() { std::cout << "B::f()" <<std::endl; } }; int main() { A a; a.f(); B b; b.IB_f(); b.g(); return 0; } С выводом ![]() ![]() A::f() B::f() B::g() Добавлено Цитата korvin @ Цитата IL_Agent @ В C# это не так. При реализации придётся явно указать, от какого интерфейса взят метод. ![]() ![]() void InterfaceName.MethodName(int a) {...} т.е. нужно реализовывать два метода? А как выглядит вызов этих методов? Например, так ![]() ![]() using System; interface IA { void f(); } interface IB { void f(); } class A : IA, IB { void IA.f() { Console.WriteLine("IA.f"); } void IB.f() { Console.WriteLine("IB.f"); } } class Program { public static void Main(string[] args) { A a = new A(); (a as IA).f(); (a as IB).f(); } } |
|
Сообщ.
#2133
,
|
|
|
|
Цитата D_KEY @ Если рассматривать классы, то С++ удовлетворяет критериям. А отдельного понятия "модуль" в С++ нет Если конечно не ошибаюсь, но в Eiffel "один класс" = "один файл/модуль". |
|
Сообщ.
#2134
,
|
|
|
|
Цитата DesweR @ Цитата D_KEY @ Если рассматривать классы, то С++ удовлетворяет критериям. А отдельного понятия "модуль" в С++ нет Если конечно не ошибаюсь, но в Eiffel "один класс" = "один файл/модуль". А причем тут файлы? Файлы - это физическое размещение текста программы. Мы же говорили о логике. Модуль - логическая единица программы. Пространство имен/пакет/"кластер"(Eiffel) - механизм логического объединения. Файл /= модуль Добавлено Цитата Qraizer @ Цитата korvin @ Ну, первое не проблема. А вот второе - категорическое нет. Это методы разных интерфейсов. С какого перепуга они окажутся одним и тем же? Имена совпали? Бывает. Кто виноват? Да никто.2) совпадают полностью сигнатуры -- никакой колизии, просто один и тот же метод, в чем проблема? пересечение множеств всего-навсего Как это никто? Разработчики. Теоретически разные интерфейсы не должны иметь одинаковых имен с разным смыслом. В этом есть разница между интерфейсами и абстрактными классами. Интерфейсы не описывают абстрактный тип данных, они описывают именно набор операций. Хотя я понимаю, что на практике такие коллизии бывают и их нужно разруливать, но это не от хорошей жизни. Добавлено Цитата DesweR @ К слову спросить, а в C# есть ли дизайн классов по контракту? В Oxygene (Delphi Prism) есть http://prismwiki.codegear.com/en/Class_Contracts Есть, но по сравнению с Eiffel не так удобен. Разработчики на Eiffel уверяют, что они просто чувствуют себя обязанными написать инварианты, пред и пост условия А так и для С++ есть... |
|
Сообщ.
#2135
,
|
|
|
|
Цитата Qraizer @ Зато Shaggy лишён возможности наследовать готовые реализации ITCP и IHistory, написанные с год назад для разных проектов. безосновательное утверждение... Добавлено Цитата D_KEY @ Теоретически разные интерфейсы не должны иметь одинаковых имен с разным смыслом. это почему? |
|
Сообщ.
#2136
,
|
|
|
|
Цитата Shaggy @ Цитата D_KEY @ Теоретически разные интерфейсы не должны иметь одинаковых имен с разным смыслом. это почему? Зачем нескольким интерфейсам иметь два одинаковых метода с совершенно разным предполагаемым(и никак неотраженным в контракте) поведением? Код должен стремится к самодокументированию и из названия метода должно быть полностью понятно, ЧТО он делает(реализация же определяет КАК). Если уж вам нужен метод "время жизни", то он должен иметь один смысл("время жизни того объекта, для которого я его вызываю"), в противном случае название выбрано не верно. |
|
Сообщ.
#2137
,
|
|
|
|
Цитата D_KEY @ Код должен стремится к самодокументированию и из названия метода должно быть полностью понятно, ЧТО он делает(реализация же определяет КАК). ты почему-то рассмариваешь метод как отдельную сущьность есть же ещё интерфейс(имя), namespace, если угодно interfaceName.methodName - вполне себе понятно что он делает... |
|
Сообщ.
#2138
,
|
|
|
|
Цитата D_KEY @ Зачем нескольким интерфейсам иметь два одинаковых метода с совершенно разным предполагаемым(и никак неотраженным в контракте) поведением? ![]() ![]() interface IIntList { void Add(int value); } interface INumber { void Add(int value); } |
|
Сообщ.
#2139
,
|
|
|
|
Цитата Shaggy @ Цитата D_KEY @ Код должен стремится к самодокументированию и из названия метода должно быть полностью понятно, ЧТО он делает(реализация же определяет КАК). ты почему-то рассмариваешь метод как отдельную сущьность есть же ещё интерфейс(имя), namespace, если угодно Потому, что единственное логическое отличие интерфейса от абстрактного класса заключается в том, что интерфейс не обязан описывать абстрактный тип - он описывает именно набор операций. В противном случае, почему бы не воспользоваться абстрактными классами? Пространством имен интерфейсы тем более считать не стоит. ИМХО. Цитата А безымянных интерфейсов не может быть?interfaceName.methodName - вполне себе понятно что он делает... Мне казалось бы логичным наличие такого механизма. Вообще, на мой взгляд, интерфейсы максимально полезными были бы в виде языковой конструкции, описывающей контракт некоторого объекта, не требующей явного указания при наследовании, и которую можно было бы использовать и во время компиляции, и во время выполнения. Ладно, меня немного несет не в ту сторону В рамках данного холивара могу лишь повторить свою мысль о том, что в условиях множественного наследования и абстрактных классов интерфейсы в языках, подобных обсуждаемым, не нужны. Добавлено jack128, ИМХО, List "не правильный". Тем более, в качестве интерфейса. В любом случае, это "один и тот же" метод - "добавь к моему объекту значение int". Какие конфликты? |
|
Сообщ.
#2140
,
|
|
|
|
Цитата Shaggy @ ты почему-то рассмариваешь метод как отдельную сущьность есть же ещё интерфейс(имя), namespace, если угодно interfaceName.methodName - вполне себе понятно что он делает... потому что методы и есть отдельные сущности, интерфейсы лишь способ описать множество методов, пространства имен они не создают, их создают классы |
|
Сообщ.
#2141
,
|
|
|
|
Цитата korvin @ Цитата Shaggy @ ты почему-то рассмариваешь метод как отдельную сущьность есть же ещё интерфейс(имя), namespace, если угодно interfaceName.methodName - вполне себе понятно что он делает... потому что методы и есть отдельные сущности, интерфейсы лишь способ описать множество методов, пространства имен они не создают, их создают классы Не забывай, что в обсуждаемых языках(ну кроме С++) интерфейсы нужны в качестве костыля для обеспечения множественного наследования |
|
Сообщ.
#2142
,
|
|
|
|
Цитата D_KEY @ А безымянных интерфейсов не может быть? пример? Цитата korvin @ интерфейсы лишь способ описать множество методов, пространства имен они не создают, их создают классы хм... |
|
Сообщ.
#2143
,
|
|
|
|
Цитата Shaggy @ Цитата D_KEY @ А безымянных интерфейсов не может быть? пример? На некотором абстрактном языке: ![]() ![]() f(interface { f(self, int)->int } object, int x) -> int { //... return object.f(10) } Цитата А что, не так-то? Цитата korvin @ интерфейсы лишь способ описать множество методов, пространства имен они не создают, их создают классы хм... |
|
Сообщ.
#2144
,
|
|
|
|
Цитата D_KEY @ Не забывай, что в обсуждаемых языках(ну кроме С++) интерфейсы нужны в качестве костыля для обеспечения множественного наследования слайды! слайды! приведи пример(и желательно не один) в котором интерфейсы используются именно в таком качестве... Добавлено Цитата D_KEY @ На некотором абстрактном языке: ничего непонял... а на каком-то реальном языке можно? |
|
Сообщ.
#2145
,
|
|
|
|
Цитата Shaggy @ Цитата D_KEY @ Не забывай, что в обсуждаемых языках(ну кроме С++) интерфейсы нужны в качестве костыля для обеспечения множественного наследования слайды! слайды! приведи пример(и желательно не один) в котором интерфейсы используются именно в таком качестве... В каком таком? Ты никогда не наследовал один класс от нескольких интерфейсов? Цитата Цитата D_KEY @ На некотором абстрактном языке: ничего непонял... а на каком-то реальном языке можно? Интерфейс описан прямо в параметре, без явного задания имени интерфейса. Просто говорим, что наша функция(метод) принимает любой объект, у которого есть метод f, принимающий целое число и возвращающий целое число. |