Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация интерфейса вложенным объектом 
:(
    Опции темы
RinOSpro
Дата 6.8.2008, 11:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Читал про интерфейсы... http://www.interface.ru/home.asp?artId=5859  и остановился на вот этом: 6.10. Реализация интерфейса вложенным объектом. 

И ни как не могу дойти что это и для чего это нужно...

Код

6.10. Реализация интерфейса вложенным объектом
Случается, что реализация интерфейса содержится во вложенном объекте класса. 
Тогда не требуется программировать реализацию интерфейса путем замыкания каждого метода интерфеса на соответствующий метод вложенного объекта. Достаточно делегировать реализацию интерфейса вложенному объекту с помощью директивы implements:

type
  TTextParser = class(TInterfacedObject, ITextReader)
    ...
    FTextReader: ITextReader;
    property TextReader: ITextReader read FTextReader implements ITextReader;
    ...
  end;

В этом примере интерфейс ITextReader в классе TTextParser реализуется не самим классом, а его внутренней переменной FTextReader.

Очевидно, что внутренний объект должен быть совместим с реализуемым интерфейсом.



Объясните плиз!

Это сообщение отредактировал(а) RinOSpro - 6.8.2008, 11:18
  Вверх
Felan
Дата 6.8.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Цитата(RinOSpro @  6.8.2008,  13:17 Найти цитируемый пост)
Случается, что реализация интерфейса содержится во вложенном объекте класса. 

Это значит, что если у тебя есть объект, которые должен реализовывать интерфейс, который уже реализован вложенным объектом. И реализация этого интерфейса не должна быть точно такой же как у вложенного.

Цитата(RinOSpro @  6.8.2008,  13:17 Найти цитируемый пост)

Тогда не требуется программировать реализацию интерфейса путем замыкания каждого метода интерфеса на соответствующий метод вложенного объекта. 
Достаточно делегировать реализацию интерфейса вложенному объекту с помощью директивы implements:

ЭТо значит что тебе не надо создавать методы реализующие интерфейс, и вызывать в них соответствующие методы вложенного объекта. Или в ручную их связывать, достаточно делегировать...

Это можно применять в тех случаях когда сложный объект состоит из множества вложенных, и должен реализовывать интерфейсы, которые итак уже реализованы вложенными.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 6.8.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(RinOSpro @  6.8.2008,  10:17 Найти цитируемый пост)
И ни как не могу дойти что это и для чего это нужно...

  Представь что твой класс использует стратегии для изменения своего поведения и адаптации к новым условиям.  Объект TTextParser создает объекты разных классов и получает их интерфейс в FTextReader. В зависимости от тогочто он создаст поведение объекта меняется.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RinOSpro
Дата 6.8.2008, 12:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата

-Папа а что такое стартер? 
-Сынок стартер это Стартер

smile
Felan  - честно не совсем понимаю... Может когда столкнусь дойдет...

Вот к премеру с какой целью в класс засовывать его же интерфейс:

Код

 TTextParser = class(TInterfacedObject, ITextReader)
    ...
    FTextReader: ITextReader;
    ...

  Вверх
pseud
Дата 6.8.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(RinOSpro @  6.8.2008,  12:06 Найти цитируемый пост)
Вот к премеру с какой целью в класс засовывать его же интерфейс:


это не его интерфейс, а интерфейс который он реализует.
и его могут реализовывать другие классы,  не только потомки  TTextParser.



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Rrader
  Дата 6.8.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Цитата

Начиная с Delphi 4, был предоставлен новый важный механизм реализации интерфейсов. Вместо того, чтобы явно объявлять и реализовывать каждый метод интерфейса, Вы можете объявить свойство типа класс или интерфейс и делегировать реализацию интерфейса этому свойству. Когда объект, реализующий интерфейс, назначается интерфейсной ссылке, этот объект, назначается свойству интерфейса, которое снабжается интерфейсной ссылкой.

На первый взгляд это дополнение поддержки интерфейсов может показаться необязательным, но в действительности ("в действительности" устаревшее выражение, на самом деле современные люди употребляют выражение "на самом деле" пр. пер.) оно очень полезно. На примере продемонстрируем почему. Представим, что у Вас есть 20 различных объектов, которые должны реализовать один интерфейс. Допустим, что эти объекты не наследуют методы интерфейса. В Delphi 3 было необходимо для каждого из реализующих классов объявить и реализовать методы интерфейса. Допустим, что все 20 классов, реализуют интерфейс абсолютно одинаково и Вы имеете 20 различных копий одного кода. Если Вы решите, что общая реализация должна быть изменена, Вам надо будет изменить код в 20 различных классах.

Реализация интерфейсов делегированием решает эту проблему. Вместо объявления и реализации интерфейса в каждом из 20 классов, Вы можете создать один класс, реализующий интерфейс. Затем, в каждом из 20 классов, в которых должен быть реализован одинаковый интерфейс, Вы объявляете свойство, которое может содержать ссылку на этот предварительно созданный класс. Другими словами, все 20 классов могут совместно использовать реализацию, предоставленную одним классом. Если Вам позже понадобиться изменить реализацию интерфейса, Вы просто вернетесь к Вашему единственному классу и измените его реализацию. Поскольку все 20 классов делегируют реализацию этому единственному классу, их реализация автоматически изменится.

Как уже упоминалось, есть два типа свойств, которые Вы можете использовать для реализации интерфейса делегированием: свойство типа класс, и свойство типа интерфейс. Кроме того, когда Вы объявляете, что свойство реализует интерфейс делегированием, синтаксис свойства должен включать директиву implements, сопровождаемую названием интерфейса, который оно реализует.



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Felan
Дата 6.8.2008, 14:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Цитата(RinOSpro @  6.8.2008,  14:06 Найти цитируемый пост)
Felan  - честно не совсем понимаю... Может когда столкнусь дойдет...
Вот к премеру с какой целью в класс засовывать его же интерфейс:


Как тебе уже сказали, это не "его" интерфейс. Интерфейс это контракт, который собственно никак не связан с классом. Не надо путать его с интерфейсом класса, где интерфейс класса - это набор методов и свойств класса, как правило публичных. Так что интерфейс и интерфейс класса это просто слова похожие, а на самом деле это разные вещи, если можно так сказать.

То, что класс реализует нейкий интерфейс (не интерфейс класса), это не значит, что у этого класса не может быть других методов. Класс может реализовывать несколько интерфейсов...
Вообще-то в той книге, где ты это вычитал все это есть...
Если это сделано, то например в процедуру принимающую параметра типа какого-либо интерфейса могут быть переданы любые объеты реализующие этот интерфейс. Они не обязательно должны быть в одном дереве наследования, как в случае с базовым классом. Это называется полиморфизм. Попробуй почитать про паттерны проектирования, в особенности паттерны "Команда", "Фабрика", "Фабричный метод". Там это используется.

Это используется в проектировании архитектуры классов.



--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0762 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.