Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 320 321 [322] 323 324 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#4816
,
|
|
|
|
Я могу подгрузить и выгрузить плагин с классом, по которому мне нужна диспетчеризация. Господа, я же специально оговорился |
|
Сообщ.
#4817
,
|
|
|
|
Почему? Ведь нужный метод будет вызыван. Просто класс по какой-то причине решил, что при работе именно с его контрактом этот метод использовать нельзя... Хотя я пока не знаю, зачем это может понадобиться. Цитата Цитата D_KEY @ Уверен? Мне казалось, что я так делал. Пойду читать Если ты прав, то спасибо за поправку ![]() уверен. проверено в IDEA =) Может и в C# тогда нельзя? Вообще странное поведение. Добавлено Я вот одного не понимаю, почему в Delphi интерфейсы смешали с подсчетом ссылок? |
|
Сообщ.
#4818
,
|
|
|
|
Цитата D_KEY @ Я вот одного не понимаю, почему в Delphi интерфейсы смешали с подсчетом ссылок? Да там и COM смешали с языком... . И паттерны смешали с языком... . И много что смешали. |
|
Сообщ.
#4819
,
|
|
|
|
Цитата D_KEY @ Почему? Ведь нужный метод будет вызыван. Просто класс по какой-то причине решил, что при работе именно с его контрактом этот метод использовать нельзя... Хотя я пока не знаю, зачем это может понадобиться. да фигня какая-то имхо. Цитата D_KEY @ Может и в C# тогда нельзя? Вообще странное поведение. почему странное? приватные мемберы класса доступны только ему, защищенные -- ему и наследникам, публичные -- всем |
|
Сообщ.
#4820
,
|
|
|
|
Цитата MyNameIsIgor @ Я могу подгрузить и выгрузить плагин с классом, по которому мне нужна диспетчеризация. Ну, сам этот класс должен быть известен на этапе построения диспатчера. Так? Значит и thunk-и ты можешь для него прописать заранее. А они, в свою очередь, могут работать по-разному в зависимости от наличия загруженного плагина. Таким образом, диспетчер остаётся полностью статически-типизируемым. |
|
Сообщ.
#4821
,
|
|
|
|
Цитата korvin @ приватные мемберы класса доступны только ему, защищенные -- ему и наследникам, публичные -- всем Именно так. Доступа к методу у тебя нет, но перекрытие не является формой доступа ![]() ![]() class A { public: void f() { f1(); f2(); f3(); } protected: virtual void f1(); private: virtual void f2() virtual void f3(); }; class B : public A { public: //... protected: virtual void f1() { // имеем доступ к A::f1 } private: virtual void f2() { // НЕ имеем доступ к A::f2 } virtual void f3() { // НЕ имеем доступ к A::f3 } }; Как мне обеспечить это в Java/Delphi? Зачем предоставлять дополнительный доступ, если требуется лишь возможность перекрытия? |
|
Сообщ.
#4822
,
|
|
|
|
Цитата Flex Ferrum @ Ну, сам этот класс должен быть известен на этапе построения диспатчера. Так? При построении плагина - да. Приложения - нет. В приложении я только знаю, что мне из плагина отдадут наследника какого-то базового класса. |
|
Сообщ.
#4823
,
|
|
|
|
Цитата D_KEY @ Цитата korvin @ приватные мемберы класса доступны только ему, защищенные -- ему и наследникам, публичные -- всем Именно так. Доступа к методу у тебя нет, но перекрытие не является формой доступа ![]() ![]() class A { public: void f() { f1(); f2(); f3(); } protected: virtual void f1(); private: virtual void f2() virtual void f3(); }; class B : public A { public: //... protected: virtual void f1() { // имеем доступ к A::f1 } private: virtual void f2() { // НЕ имеем доступ к A::f2 } virtual void f3() { // НЕ имеем доступ к A::f3 } }; Как мне обеспечить это в Java/Delphi? Зачем предоставлять дополнительный доступ, если требуется лишь возможность перекрытия? в смысле? т.е. при вызове B::f() будет вызван B::f2(), а не A::f2()? |
|
Сообщ.
#4824
,
|
|
|
|
Цитата korvin @ в смысле? т.е. при вызове B::f() будет вызван B::f2(), а не A::f2()? Да. Добавлено В тему свойств, наткнулся на цитату Джефри Рихтера Цитата Лично мне свойства не нравятся, и я был бы рад, если бы их поддержку убрали из Microsoft .NET Framework и сопутствующих языков программирования. Причина в том, что свойства выглядят как поля, на самом деле являясь методами |
|
Сообщ.
#4825
,
|
|
|
|
Цитата D_KEY @ ![]() ![]() ... class B : public A { ... protected: virtual void f1() { // имеем доступ к A::f1 } ... }; нет, в Java мы не имеем доступ к A::f1. |
|
Сообщ.
#4826
,
|
|
|
|
Цитата scorpion @ И когда как? Пример можно привести? Зачем тогда нужен интерфейс с дополнительным функционалом? Для использования интерфейсов в Delphi есть несколько дизайн-паттернов, каждый выбирается в конкретном случае. 1. Есть подсчет ссылок/нет подсчета 2. Интерфейс агрегирован, содержится или реализован напрямую 3. Есть публичные методы или нет и так далее. Все достаточно разнообразно. Если объект основной, то как правило у него есть свой функционал и нет подсчета ссылок, интерфейсы - дополнительные функции, например для системы сохранения/загрузки или управления транзакцией или получения дополнительной информации. Если работа через интерфейсы, то опять же как правило делают подсчет ссылок и закрывают все методы кроме служебных, это еще и страховка: в Delphi нет явных способов понять что объект уже уничтожен. В этом случае подразумевается что функционал не знает с каким именно объектом он работает. Ну и естественно возможны другие варианты. Цитата D_KEY @ Я вот одного не понимаю, почему в Delphi интерфейсы смешали с подсчетом ссылок? Почему нет? Впрочем, ответ простой, изначально они появились из-за поддержки COM, а потом так и осталось. Цитата D_KEY @ Как мне обеспечить это в Java/Delphi? Эээ. Через свойства подобное можно сделать. Или нет. Вроде нельзя, по крайней мере в голову ничего путного не приходит. |
|
Сообщ.
#4827
,
|
|
|
|
Цитата korvin @ нет, в Java мы не имеем доступ к A::f1. Ы? А как жеж? ![]() ![]() super.f1() |
|
Сообщ.
#4828
,
|
|
|
|
Цитата D_KEY @ Может и в C# тогда нельзя? Вроде там идет ошибка компиляции при попытке создания закрытого виртуального/абстрактного метода. Проверить не могу. |
|
Сообщ.
#4829
,
|
|
|
|
Цитата D_KEY @ Да. не нравится мне это =) Цитата D_KEY @ В тему свойств, наткнулся на цитату Джефри Рихтера Цитата Лично мне свойства не нравятся, и я был бы рад, если бы их поддержку убрали из Microsoft .NET Framework и сопутствующих языков программирования. Причина в том, что свойства выглядят как поля, на самом деле являясь методами молодец Рихтер, всё правильно сказал Добавлено Цитата MyNameIsIgor @ Цитата korvin @ нет, в Java мы не имеем доступ к A::f1. Ы? А как жеж? ![]() ![]() super.f1() private-метод нельзя так вызвать |
|
Сообщ.
#4830
,
|
|
|
|
Цитата korvin @ private-метод нельзя так вызвать Так он protected Добавлено У D_KEY'я A::f1 - защищённый, а не приватный. |