Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 314 315 [316] 317 318 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#4726
,
|
|
|
|
Цитата Flex Ferrum @ Ну, на самом деле, там не совсем константное время поиска получится. Потому что потребутеся преобразовывать хэш типа аргумента в индекс. За константное время это сделать нельзя. Гммм... Когда я размышлял над этой проблемой, то пришёл к выводу, что самая сложная часть - определение иерархии наследования run-time. Как я понимаю, мы не можем это сделать в момент регистрации мультиметода. Возможность у нас появляется только в момент вызова с реальными экземплярами классов. Соответственно, если организовать кэш в виде хэш-таблицы, где ключом будет кортеж хэшей, полученных от type_info, то не константным по сложности будет только первый вызов, а потом мы найдём нужную функцию в кэше. Я не слишком сумбурно объясняю свои мысли? ![]() Не вижу в этом проблемы. Как же они доберутся до скрываемых методов, если знают только об интерфейсе? Богомерзкой рефлексией? |
|
Сообщ.
#4727
,
|
|
|
|
и это говорит программист на языке, в котором есть интерфейсы... если ты говоришь, что класс A реализует интерфейс I, то он и должен реализовать этот интерфейс. ну сделаешь ты ![]() ![]() interface I { void foo(); void bar(); } class A implements I { public void foo() { System.out.println("foo"); } private void bar() { System.out.println("bar"); } } public class App { private static void main(I obj) { obj.foo(); obj.bar(); // что тут должно произойти по-твоему? } public static void main(String[] args) { main(new A()); } } Добавлено в каком месте он не дозволенный, если мы заявили, что класс A реализует интерфейс I? а по-твоему как раз получается наоборот, интерфейс позволяет получить доступ к приватным методам, хотя они приватные и не должны быть доступны и получается, что через интерфейс мы можем заюзать недозволенный функционал. в чем смысл? |
|
Сообщ.
#4728
,
|
|
|
|
Цитата MyNameIsIgor @ Гммм... Когда я размышлял над этой проблемой, то пришёл к выводу, что самая сложная часть - определение иерархии наследования run-time. Как я понимаю, мы не можем это сделать в момент регистрации мультиметода. Возможность у нас появляется только в момент вызова с реальными экземплярами классов. Соответственно, если организовать кэш в виде хэш-таблицы, где ключом будет кортеж хэшей, полученных от type_info, то не константным по сложности будет только первый вызов, а потом мы найдём нужную функцию в кэше. Я не слишком сумбурно объясняю свои мысли? ![]() Иерархия наследования - фигня. Главное - иметь возможность определить финальный тип (в рантайме). Общая идея проста (предложена Qraizer'ом). Делается n-мерный массив (n - количество аргументов в методе), каждая ячейка которого сопоставляется с уникальным кортежем типов. Дальше в ячейку заносится указатель на функцию, задача которой - преобразовать переданные параметры в соответствующие им типы и (уже типизированно) позвать диспетчер. Диспетчер, вызванный с полным набором финальных типов, делегирует выбор перегрузки компилятору (как это сделано в текущей реализации). Собственно, проблема сводится к корректному преобразованию из typeid в индекс, а также заполнению многомерной таблицы. |
|
Сообщ.
#4729
,
|
|
|
|
Цитата korvin @ ну сделаешь ты А если ты здесь дел натворишь? ![]() ![]() IGuest = interface procedure ReadDocument; end; IUser = interface(IGuest) procedure WriteDocument; end; IAdmin = interface(IUser) procedure CreateDocument; procedure DeleteDocument; end; TMailService = class(TInterfacedObject, IGuest, IUser, IAdmin) private procedure ReadDocument; procedure WriteDocument; procedure CreateDocument; procedure DeleteDocument; end; Это правила хорошего тона программирования. |
|
Сообщ.
#4730
,
|
|
|
|
Цитата DesweR @ А если ты здесь дел натворишь? каких еще дел? я запросто могу все дела наворотить через интерфейс. какая разница-то? Цитата DesweR @ Это правила хорошего тона программирования. лол, откуда эти правила взялись? правилом хорошего тона является утверждение, что класс реализует какой-то интерфейс, но по факту этот интерфейс не реализет? |
|
Сообщ.
#4731
,
|
|
|
|
Цитата Flex Ferrum @ Иерархия наследования - фигня. Хз-хз... Цитата Flex Ferrum @ Собственно, проблема сводится к корректному преобразованию из typeid в индекс, а также заполнению многомерной таблицы. Ну, так из typeid получаем type_info, который хэшируемый - имеем постоянное время поиска по таблице. |
|
Сообщ.
#4732
,
|
|
|
|
Цитата korvin @ а по-твоему как раз получается наоборот, интерфейс позволяет получить доступ к приватным методам, хотя они приватные и не должны быть доступны и получается, что через интерфейс мы можем заюзать недозволенный функционал. в чем смысл? Приватны для объекта, публичны для интерфейса. Просто интерфейс надо рассматривать не как абстрактное описание, а как отдельную сущность, и все становится на свои места. Объект реализует интерфейс, а не обладает интерфейсом. И чаще всего код, работающий с объектом и код, который работает с его интерфейсом, резко разграничены, то есть клиент, использующий интерфейс ничего не знает о его реализации, и наоборот. Преимущество в том, что при этом прямо в коде указывается и документируется способ работы с данными объектами. |
|
Сообщ.
#4733
,
|
|
|
|
Хи хи хи , А через интерфейсы мы значит не можем этот функционал заюзать? |
|
Сообщ.
#4734
,
|
|
|
|
Цитата Romkin @ то есть клиент, использующий интерфейс ничего не знает о его реализации Правильно Цитата Romkin @ и наоборот Наоборот - это как? Работающий с реализацией не знает, что она реализует? Отдаёт бредом... |
|
Сообщ.
#4735
,
|
|
|
|
Флекс, а как у тебя выбирается метод при множественном наследовании? т.е. например имеем классы (синтаксис условный)
![]() ![]() class A1; class A2; class B : A1, A2; и методы ![]() ![]() void method(A1 x) { // do something } void method(A2 x) { // do something else } какой метод вызовется в случае ![]() ![]() B b; method(b); ? |
|
Сообщ.
#4736
,
|
|
|
|
Цитата korvin @ каких еще дел? я запросто могу все дела наворотить через интерфейс. какая разница-то? Имея только интерфейс IGuest, ты не сможешь сделать то, что доступно только IAdmin. |
|
Сообщ.
#4737
,
|
|
|
|
Так это было там написано, у тебя же, в твоем коде, TBC1 реализует только IB и IC, но как ты сам сказал, не реализует IA. Цитата DesweR @ Нет, я действительно имел ввиду неизвестный на момент компиляции. Либо пользователем из gui, либо каким-нибудь алгоритмом, по заданным условиям, определяются доступные реализации и регистрируются в фабрике. Ггг... Во первых, что ты собрался делать с интерфейсом, не известным на этапе компиляции? Во вторых, как с ним работать, и какие методы у него вызывать? в третьих, как пользователь из gui будет его гдето регистрировать и определять доступные реализации? Оно вообще, пользователю нужно? Что за бред вообще ты несешь? |
|
Сообщ.
#4738
,
|
|
|
|
korvin, не знаю как у Flex'а, но по умолчанию это должно быть исключение. Поскольку плюсы не позволяют определить порядок наследования, то единственный способ настройки пользователем - это просмотр в порядке регистрации методов (или в обратном).
|
|
Сообщ.
#4739
,
|
|
|
|
Цитата DesweR @ Имея только интерфейс IGuest, ты не сможешь сделать то, что доступно только IAdmin. А что изменится, если методы в классе сделать паблик? Неужто, в этом случае "Имея только интерфейс IGuest ты сможешь сделать то, что доступно только IAdmin? |
|
Сообщ.
#4740
,
|
|
|
|
Цитата scorpion @ Так это было там написано, у тебя же Там тоже самое написано (это я писал, если что). Цитата scorpion @ TBC1 реализует только IB и IC, но как ты сам сказал, не реализует IA. Верно. |