
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.62] |
![]() |
|
Страницы: (117) « Первая ... 66 67 [68] 69 70 ... 116 117 ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#1006
,
|
|
Аргументируй мне для начала как такое должно работать без полиморфизма(за синтаксис не бить): ![]() ![]() procedure f(i: IInterface); begin i.foo(5); end; var i1, i2: IInterface; begin i1 = Impl1.Create; i2 = Impl1.Create; f(i1); f(i2); end; |
Сообщ.
#1007
,
|
|
|
Цитата Орион @ не то, что имелось ввиду)))) хорошо, смотри: есть класс, который реализует поведение А и класс, который реализует поведение А1, а есть класс, который реализует поведение Б, а есть класс, который реализует поведение С. Тебе нужен класс Х, который реализует поведение А и А1(доступное всем) и поведение Б(доступное наследникам) и поведение С(доступное только классу Х). Как это будет выглядеть в не множественном наследовании? Наследуешься от Б, дописываешь C и имплементируешь A и A1. Smike уже привел пример, в 15:28 Добавлено Цитата archimed7592 @ Аргументируй мне для начала как такое должно работать без полиморфизма(за синтаксис не бить): Просто: при обращении к foo компилятор подшивает прямой адрес этого метода. Смещение в таблице известно на этапе компиляции, и одинаково для i1 и i2. То есть, затраты предполагаются такими же, что и для статического метода. |
Сообщ.
#1008
,
|
|
|
Цитата Romkin @ Просто: при обращении к foo компилятор подшивает прямой адрес этого метода. Смещение в таблице известно на этапе компиляции, и одинаково для i1 и i2. То есть, затраты предполагаются такими же, что и для статического метода. не может он прямой адрес подставить. смещение в виртуальной таблице это не адрес, но оно, да, известно. нет. статический метод имеет адрес, виртуальный - лишь место в таблице, конкретный адрес вычисляется во время выполнения. |
Сообщ.
#1009
,
|
|
|
Цитата Romkin @ Наследуешься от Б, дописываешь C и имплементируешь A и A1. Smike уже привел пример, в 15:28 ![]() ![]() |
Сообщ.
#1011
,
|
|
|
Romkin =)
а теперь посмотри первое - вот эта попытка решить такую вроде бы невинную задачку не кажется тебе немного....эм черезчур сложной и неадекватной задаче? а теперь смотри второе - а что делать когда есть несколько Б-подобных и С-подобных классов? Ты представь сколько всего нужно писать ручками для каждой комбинации......это ж ого-го! ....и повторное использование кода получается на уровне копи-паст.... |
Сообщ.
#1012
,
|
|
|
Цитата daevaorn @ не может он прямой адрес подставить. смещение в виртуальной таблице это не адрес, но оно, да, известно. нет. статический метод имеет адрес, виртуальный - лишь место в таблице, конкретный адрес вычисляется во время выполнения. Хм. Да, запутался. Впрочем, никогда не интересовался. Вроде действительно должен быть эквивалент вызову виртуального метода... Посмотрел. Да, косвенно. Сорри, это виртуальный метод. Добавлено Цитата Орион @ а что делать когда есть несколько Б-подобных и С-подобных классов? Ты представь сколько всего нужно писать ручками для каждой комбинации......это ж ого-го! Представить уже не могу ![]() |
Сообщ.
#1013
,
|
|
|
Откуда же тебе известны такие тайны Delphi-компилятора? Цитата archimed7592 @ Аргументируй мне для начала как такое должно работать без полиморфизма(за синтаксис не бить): Ну вообще-то такое не будет компилироваться ![]() Ориону: вполне нормальная реализация, все четко распределено. Зато я могу например вместо одной подсунуть любую другую. А как это с множественным наследованием? И неужели удобно потом разбирать десятки методов из разных классов? А главное, классы-имплементоры совершенно не зависят от класса-агрегатора. Добавлено Интерфейс — это по идее не более чем свидетельство, что данный класс должен содержать определенный метод. То есть некая таблица смещений, но это уже если интерфейс получен от конкретного класса. В коде это не больше чем декларация. А вот в C++ интерфейсы действительно реализованы через задний проход ![]() |
Сообщ.
#1014
,
|
|
|
Цитата Smike @ А вот в C++ интерфейсы действительно реализованы через задний проход ![]() Откуда же тебе известны такие тайны С++-компилятора? |
Сообщ.
#1015
,
|
|
|
Цитата Flex Ferrum @ Откуда же тебе известны такие тайны С++-компилятора? Это не секрет. В C++ интерфейсы реализованы через абстрактные классы ![]() |
Сообщ.
#1016
,
|
|
|
Цитата Smike @ Это не секрет. В C++ интерфейсы реализованы через абстрактные классы ![]() а докажи, что это хуже? |
Сообщ.
#1017
,
|
|
|
Цитата Smike @ В C++ интерфейсы реализованы через абстрактные классы И что? Чем плоха такая реализация? |
![]() |
Сообщ.
#1018
,
|
|
Smike, ок, приведи мне компилируемый код, следующей структуру(если это вообще возможно):
1. есть интерфейс IMyInterface, обязующий имплементирующий класс содержать ф-цию foo принимающую аргумент целового типа и возвращающую булево значение. 2. есть два класса, реализующих этот интерфейс TMyImpl1 и TMyImpl2 разными способами. 3. сделай произвольную процедуру(в глобальном пространстве имён или в другом классе) с именем interfaceCall, которая принимает "ссылку"(или как это у вас называется) на объект, реализующий интерфейс IMyInterface. Эта процедура должна вызывать эту самую ф-цию foo c некоторым аргументом и выводить возвращённое значение на экран. 4. в произвольном месте создай объекты типа TMyImpl1 и TMyImpl2 и вызови процедуру interfaceCall сначала передав ей в качестве аргумента объект типа TMyImpl1, потом объект типа TMyImpl2. |
Сообщ.
#1019
,
|
|
|
Цитата Smike @ Откуда же тебе известны такие тайны Delphi-компилятора? Может для тебя это и тайна ![]() Если знаешь ассемблер, то попробуй поработать вместо компилера, посмотрим с каким оверхедом у тебя получится код для работы с интерфейсами. |
Сообщ.
#1020
,
|
|
|
Цитата Alex Forth @ Если знаешь ассемблер не пугай дельфинов этим словом;) |