powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Возможность создания новых типов интерфейсов в новых версиях Delphi
53 сообщений из 53, показаны все 3 страниц
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620153
Фотография Leonid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для тех, кто регулярно штудирует дельфийские What's New и параллельно читает блоги Марко Канту - это далеко и не новость. Но ИМНО лишний раз поделиться все же стоит.
Речь идет о применении двух относительно новых атрибутах из System.pas А именно WeakAttribute, UnsafeAttribute .
Изначально оба этих атрибута введены для поддержки ARC ( Automatic Reference Counting ) в мобильных поделках на Дельфях.
Без них не получается обойти проблему взаимного увеличения RefCount между ссылающихся друг на друга объектов и как следствие невозможность правильно освободить память основываясь лишь на механизме ARC.

Спрашивается, чем эти атрибуты могут быть полезны для пишущих под Десктоп? А вот чем:
Они позволяют реализовать нечто на подобии т.н. "чистых интерфейсов". Т.е. интерфейсов не обремененных заботой об увеличении/уменьшении числа ссылок и "самообнуляющихся" интерфейсов.
Нет, безусловно создавать минимальную реализацию IInterface, ну или наследоваться от TInterfacedObject или от TSingletonImplementation по любому придется.
Но все же есть интересные нюансы в плане работы с такими интерфейсами.

Возьмем пример более простого UnsafeAttribute
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
type
  ISomeInterface = interface
    ['{1EB95902-AFF7-4230-9B26-D6CDBFD69DF9}']
    procedure DoSomething;
  end;

  TSomeClass = class(TInterfacedObject, ISomeInterface)  // Наследуемся от TInterfacedObject, чтобы убедиться что механизм RefCount работать не будет
    procedure DoSomething;
  end;

procedure TestProc;
var
  SC: TSomeClass;
  [Unsafe] ISI: ISomeInterface; // !!! Unsafe
begin
  SC := TSomeClass.Create;
  ISI := SC; // именно таким синтаксисом а не ISI := SC as ISomeInterface;
  ISI.DoSomething;
  ISI := nil; // _Release вызван не будет (уничтожение объекта SC: TSomeClass не произойдет)
  SC.Free;
end;


В данном случае можем рассматривать ISI: ISomeInterface как просто своеобразный облегченный Pointer на интерфейс с поддержкой от компилятора.

!!! Но, если вместо
Код: plaintext
ISI := SC
вы напишете
Код: plaintext
ISI := SC as ISomeInterface
то _AddRef все же будет вызван, что в случае с TInterfacedObject приведет к увеличению RefCount и тогда на SC.Free вы получите эксепшен из процедурки TInterfacedObject.BeforeDestruction, которая при уничтожении проверяет RefCount на равенство 0.

ИМХО: Как по мне так это очередной баг компилятора. Если уж для Unsafe интерфейсов не вызывается _Release, то и _AddRef тоже не должен вызываться ни при каком синтаксисе.
Но либо можно пользоваться простым присвоением (как в примере). Либо же объекты должны наследоваться от TSingletonImplementation, где и без того учет количества ссылок не важен, но тогда и тогда и этот unsafe не особо-то уже и нужен

Теперь о применении WeakAttribute
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
type
  ISomeInterface = interface
    ['{1EB95902-AFF7-4230-9B26-D6CDBFD69DF9}']
    procedure DoSomething;
  end;

  TSomeClass = class(TSingletonImplementation, ISomeInterface)  // В данном случае наследуемся от TSingletonImplementation
    procedure DoSomething;
  end;

procedure TestProc;
var
  SC: TSomeClass;
  [Weak] ISI: ISomeInterface;
begin
  SC := TSomeClass.Create;
  ISI := SC; // !!! можно и ISI := SC as ISomeInterface но только для TSingletonImplementation
  SC.Free;
  ISI.DoSomething; // Здесь самое интересное. К этому моменту ISI будет автоматически обнулен ( = nil ), поэтому схлопочем AccessViolation
end;


!!! WeakAttribute лучше НЕ использовать с объектами, где учитывается RefCount типа TInterfacedObject
Причина в том, что при использовании синтаксиса ISI := SC произойдет "непредвиденный" запуск _Release ( ИМНО Побочный баг ведения списка weak ссылок ) и ваш TInterfacedObject может быть преждевременно уничтожен.
В случае же с TSingletonImplementation и подобных это не важно.

Главный же плюс от применения Weak интерфейсов в том, что они автоматически обнуляются ( переменным присваивается nil ) при уничтожении объекта на который они ссылаются (см. пример).
Т.е. фактически Дельфина теперь ведет managed учет weak ссылок. И это может быть полезно в некоторых схемах, поскольку мы можем узнать об уничтожении главного объекта проверив интерфейсную переменную на nil.

!!! Нужно быть внимательным при объявлении [Unsafe] и [Weak] атрибутов.
Потому как, очень просто случайно написать например Week вместо Weak. Дельфи проглотит это без ошибок и лишь с малозаметным предупреждением типа "W1025 Unsupported language feature: 'custom attribute'", поскольку для него это просто имя некого неимплементированного атрибута. И тогда вместо Weak-интерфейса вы получите обычный и можете об этом и не узнать.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620157
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. В топку интерфейсы.
2. В топку ARC.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620162
под ван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat1. В топку интерфейсы.
2. В топку ARC.
человек столько писал и офармлял а ты взял и сказал как отрезал . Нельзя же так с человеками - уважай их труд а то они писать перестанут.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620186
Фотография Leonid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat1. В топку интерфейсы.
2. В топку ARC.А в след за ними в топку и старых заскорузлых отшельников-староверов aka rgreat.
Бо оне дюже мешаютЪ юным отрокам постигать что-то новое и диковинно-заморское.
Поелику интерфейсы они суть благо великое, ежели их православно уготовати, аки они суть в диковинных поделках на C#.

( так даже деду rgreat-у будет понятнее ) ;)
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620193
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid,

Я помоложе многих тут буду. А интерфейсы в дельфях с незапамятных времен есть.
Что не мешает им быть весьма спорным инструментом вне узкого круга задач.

Так что с ретроградностью ты мимо.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620194
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
rgreat1. В топку интерфейсы.
2. В топку ARC.
всячески поддержу
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620214
Фотография Leonid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЯ помоложе многих тут буду. А интерфейсы в дельфях с незапамятных времен есть.
Что не мешает им быть весьма спорным инструментом вне узкого круга задач.
Так что с ретроградностью ты мимо.Возраст он часто в голове. Нередко можно встретить и по-старчески кряхтящих подростков. Особенно часто такие встречаются среди "ботаников".

Интерфейсы же сами по себе это очень полезный инструмент. А-то что он в Дельфях изначально был создан для поддержки COM и поэтому и изначально отягощен явным заданием GUID и поддержкой RefCount - это издержки данной старинной реализации.
Поэтому-то уже давно все и выкручивались с помощью заглушек на _AddRef и _Release как в TSingletonImplementation.
Хотя, возможно нужно было бы просто давно ввести новый тип. Что-нибудь типа "simpleinterface" и все было бы идеологически куда проще.
Пока же имеем, что имеем. Зато вот появляются такие вещи как экзотические для найтива "самообнуляемые интерфейсы".

В любом случае: не хочешь - не пользуйся.
Только когда сама библиотека давно использует интерфейсы вдоль и поперек, говорить что-то типа "в топку интерфейсы" - это как бессмысленно в лужу пер... ;)
( кстати defecator в этом всегда мастер ;) )
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620219
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опиши задачи где интерфейсы есть больше смысла применять чем другие инструменты.

И почему.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620221
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatОпиши задачи где интерфейсы есть больше смысла применять чем другие инструменты.

И почему.

Например
Код: pascal
1.
for элемент in функция_возвращающая_список do 
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620223
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovrgreatОпиши задачи где интерфейсы есть больше смысла применять чем другие инструменты.

И почему.

Например
Код: pascal
1.
for элемент in функция_возвращающая_список do 

Дык, уже куча классов имеет энумераторы. Интерфейсы зачем?
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620224
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это нужно именно как самоочищающийся результат функции у себя для этого использую TArrayEx<T>.

У него и энумератор есть и самоубъется он сам при выходе из процедуры.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620236
Фотография Leonid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatОпиши задачи где интерфейсы есть больше смысла применять чем другие инструменты.
И почему.rgreat, почему я тебе должен хрестоматийные истины расписывать. Или тебе самому лениво посмотреть?
В паре/тройке предложений: interface - это явное отделение собственно "интерфеса" класса от его непосредственной реализации при котором не нужно опираться на единую ветвь наследования. Особенно когда наследование по одной ветви может являться нарушением инкапсуляции либо вообще не возможно или бессмысленно в рамках некоторой архитектуры.

На практике действительно часто либо не имеет смысла и даже вредно, либо принципиально нет возможности создавать иерархию в рамках наследования из одной цепи, но нужен "интерфейс" ( в данном случае можешь понимать "интерфейс" как нечто объединяющее твои возможно весьма разнородные объекты ), который позволит, например, однообразно передавать их в какую-то обобщенную обработку, которая в данном случае не нуждается в знании о всех этих конкретных классах.
Так понятнее? Если нет - читай книжечки про паттерны и прочее.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620240
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatasviridenkovпропущено...


Например
Код: pascal
1.
for элемент in функция_возвращающая_список do 

Дык, уже куча классов имеет энумераторы. Интерфейсы зачем?

Есть некий метод который внутри что-то умеет делать с классом реализующим интерфейс энумератор... Какой класс передан неважно, важно что он реализует интерфейс...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TSome.Test(aValue: IEnumerator)
// К примеру List и Queue, а также семантический не родственный DataSet реализуют интерфейс IEnumerator
var
  Some: TSome;
Some.Test(List);
Some.Test(Queue);
Some.Test(DataSet);
Some.Test(Form); // К примеру внутри идет проверка на реализацию IEnumerator. Если интерфейс не реализован, то поведение другое.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620242
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonidrgreat, почему я тебе должен хрестоматийные истины расписывать. Или тебе самому лениво посмотреть?
Вдруг ты мне "глаза откроешь"?

На практике действительно часто либо не имеет смысла и даже вредно, либо принципиально нет возможности создавать иерархию в рамках наследования из одной цепи, но нужен "интерфейс" ( в данном случае можешь понимать "интерфейс" как нечто объединяющее твои возможно весьма разнородные объекты ), который позволит, например, однообразно передавать их в какую-то обобщенную обработку, которая в данном случае не нуждается в знании о всех этих конкретных классах.
Так понятнее? Если нет - читай книжечки про паттерны и прочее.Дык о чем и речь. Область применения интерфейсов в реальной жизни весьма ограничена.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620244
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteЕсть некий метод который внутри что-то умеет делать с классом реализующим интерфейс энумератор... Какой класс передан неважно, важно что он реализует интерфейс...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TSome.Test(aValue: IEnumerator)
// К примеру List и Queue, а также семантический не родственный DataSet реализуют интерфейс IEnumerator
var
  Some: TSome;
Some.Test(List);
Some.Test(Queue);
Some.Test(DataSet);
Some.Test(Form); // К примеру внутри идет проверка на реализацию IEnumerator. Если интерфейс не реализован, то поведение другое.

И зачем ради этого такие сложности городить?

Чаще всего в жизни эти самые "List,Queue,DataSet,Form" будут рождены от общего родителя.
Ибо если нет, то и скорей всего этот самый Some.Test - скорей вскего будет некой синтетической, и никому реально не нужной процедурой.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620245
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну или так проще сделать интерфейсов:

Код: pascal
1.
2.
3.
4.
Some.Test(List.Test);
Some.Test(Queue.Test);
Some.Test(DataSet.Test);
Some.Test(Form.Test);



Где - Test - это некий общий тип.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620247
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*без интерфейсов
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620252
Фотография Leonid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatВдруг ты мне "глаза откроешь"?
Дык о чем и речь. Область применения интерфейсов в реальной жизни весьма ограничена.
"Глупый ты, Лешка, – улыбнулся полковник. – Прямо беда с тобой. Ты бы хоть книжку какую-нибудь прочитал.
- А зачем, Иван Антонович?
- Хотя, правильно. Тебе может и не к чему."
(с) "О бедном гусаре замолвите слово".

Я могу, например, предположить, что либо сложность проектов, с которыми ты пока сталкивался не велика, либо у тебя могут быть серьезные костыли с проектированием больших проектов, либо это твои собственный подход.
Но опять же, лично ты можешь не пользоваться какой-либо возможностью или "механизмом" и вполне себе жить и без этого.
Либо по неумению/незнанию, либо по принципиальному нежеланию. В любом случае - тогда это лично твои тараканы и обсуждать их мы не будем.
Примеры же повсеместного использования интерфейсов ты можешь найти как в самой дельфийской библиотеке, так и во множестве сторонних проектов.
Более того, есть вполне серьезные и резонные измышления о большой полезности "интерфейсного" подхода в проектировании.
Но возможность и полезность - это не значит необходимость. Поэтому лично тебя никто не заставляет.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620253
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid "Глупый ты, Лешка, – улыбнулся полковник. – Прямо беда с тобой. Ты бы хоть книжку какую-нибудь прочитал.
- А зачем, Иван Антонович?
- Хотя, правильно. Тебе может и не к чему."
(с) "О бедном гусаре замолвите слово".
YouTube Video
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620255
Фотография Leonid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЧаще всего в жизни эти самые "List,Queue,DataSet,Form" будут рождены от общего родителя.От какого общего родителя они будут рождены? Ну разве что от TObject-а
У тебя что все объекты в твоих собственных иерархиях в рамках только одной ветви наследуются? Если так - то это "тихий ужас".
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620256
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidУ тебя что все объекты в твоих собственных иерархиях в рамках только одной ветви наследуются? Если так - то это "тихий ужас".Там пошутил, сам посмеялся.
Молодец.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620258
Фотография Leonid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatОк, я понял.
У тебя талант говорить глупости с умным видом.
По сути ничего не сказано.Тебе по сути я уже сказал. Тебе даже простенький пример привели. И как раз твои возражения по этому примеру и вызывают вопросики... ;)

Ну еще как пример могу тебе привести, что чисто с прикладной точки зрения ( без каких-то рассуждалок о проектировании ) ты, например, можешь использовать единый интерфейс для сохранения в XML/JSON или еще куда своих разнородных ( не наследуемых от одного предка ) объектов. При этом процедурка не обязана вообще ничего знать о твоих объектах, а только об одном их общем интерфейсике.
Еще раз тебе говорю - это будет удобная возможность, а не обязанность.
Так же как ты, например, можешь и не пользоваться удобством обобщенных списков, а писать все на TList-ах и заниматься приведением. Ты просто не будешь пользоваться более удобным в данном случае "механизмом". Вот и все.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620259
Фотография Leonid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatLeonidУ тебя что все объекты в твоих собственных иерархиях в рамках только одной ветви наследуются? Если так - то это "тихий ужас".Там пошутил, сам посмеялся.
Молодец.Ну а как еще тебя понять?
Если ты очевидные удобства не принимаешь в принципе. Даже когда тебе детально "расжевывают", где это хорошо работает.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620261
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidТебе по сути я уже сказал. Тебе даже простенький пример привели. И как раз твои возражения по этому примеру и вызывают вопросики... ;)Меньше софистики, больше конкретики.
Ну еще как пример могу тебе привести, что чисто с прикладной точки зрения ( без каких-то рассуждалок о проектировании ) ты, например, можешь использовать единый интерфейс для сохранения в XML/JSON или еще куда своих разнородных ( не наследуемых от одного предка ) объектов. При этом процедурка не обязана вообще ничего знать о твоих объектах, а только об одном их общем интерфейсике.Подставь вместо "интерфейсика" общий "классик" для экспорта данных в XML/JSON и ничего по сути не изменится.
Еще раз тебе говорю - это будет удобная возможность, а не обязанность.И слава богу.
Так же как ты, например, можешь и не пользоваться удобством обобщенных списков, а писать все на TList-ах и заниматься приведением. Ты просто не будешь пользоваться более удобным в данном случае "механизмом". Вот и все.
Удобство интерфейсов часто в лучшем случае субъективно.
А в реальности концов потом в чужом коде концов не найти.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620262
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidНу а как еще тебя понять?Как написано. Русским по белому.

Если ты очевидные удобства не принимаешь в принципе. Даже когда тебе детально "расжевывают", где это хорошо работает.Не увидел "разжевалки".

А "очевидные удобства" таковы в теории а не на практике. А я практик.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620264
Фотография Leonid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatПодставь вместо "интерфейсика" общий "классик" для экспорта данных в XML/JSON и ничего по сути не изменится
То есть как не изменится!?
Куда ты в данном примере поставишь общий "классик"?
В условии данной задачи мы уже обговорили, что классы не наследуются по одной ветви. И мы не хотим или даже не можем вставлять никакой общий для них классик.
Поэтому либо твой обработчик должен явно знать об этих классах и заниматься приведением перед вызовом, либо можно описать общий для них интерфейс и просто заставить их его поддерживать. Если таких классов наберется много, то преимущества интерфейсного подхода в данном случае становятся очевидны.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620267
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidКуда ты в данном примере поставишь общий "классик"?
Ну чисто из головы, не зная задачи:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
TMyXMLResult = class
  function AsStream: TStream;
  // ну к примеру.
end;

class TMyList = class(TList)
  Function ToXML: TMyXMLResult;
end;
class TMyQueue = class(TQueue)
  Function ToXML: TMyXMLResult;
end;
class TMyDataSet = class(TDataSet) 
  Function ToXML: TMyXMLResult;
end;
class TMyForm = class(TForm) 
  Function ToXML: TMyXMLResult;
end;

XMLModule.Add(List.ToXML);
XMLModule.Add(Queue.ToXML);
XMLModule.Add(DataSet.ToXML);
XMLModule.Add(Form.ToXML);
XMLModule.Store_Куда_Нибуть;



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

Поэтому либо твой обработчик должен явно знать об этих классах и заниматься приведением перед вызовом, либо можно описать общий для них интерфейс и просто заставить их его поддерживать. Если таких классов наберется много, то преимущества интерфейсного подхода в данном случае становятся очевидны.Давай меньше пафоса в стиле "становятся очевидно", а?
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620268
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще пример не в тему, ибо делать общий экспорт в XML для таких разных классов как List,Queue,DataSet и Form это какой-то синтетический дурдом.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620269
Фотография Leonid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatНу чисто из головы, не зная задачи:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
TMyXMLResult = class
  function AsStream: TStream;
  // ну к примеру.
end;

class TMyList = class(TList)
  Function ToXML: TMyXMLResult;
end;
class TMyQueue = class(TQueue)
  Function ToXML: TMyXMLResult;
end;
class TMyDataSet = class(TDataSet) 
  Function ToXML: TMyXMLResult;
end;
class TMyForm = class(TForm) 
  Function ToXML: TMyXMLResult;
end;

XMLModule.Add(List.ToXML);
XMLModule.Add(Queue.ToXML);
XMLModule.Add(DataSet.ToXML);
XMLModule.Add(Form.ToXML);
XMLModule.Store_Куда_Нибуть;


Ты сам что не видишь разницы?

В этом примере ты уже передаешь готовый ToXML в какую-то процедуру.
И твоя процедура в данном случае может работать только с примитивом типа string. А если нужно будет еще что-то общее для всех этих объектов передать? Будешь везде параметры добавлять?

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

Хотя, с другой стороны, знаешь, делай так, как написал. Тебе можно ;)
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620271
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidТы сам что не видишь разницы?

В этом примере ты уже передаешь готовый ToXML в какую-то процедуру.
И твоя процедура в данном случае может работать только с примитивом типа string. А если нужно будет еще что-то общее для всех этих объектов передать? Будешь везде параметры добавлять?Ты хотел пример замены одного на другое и все. Я его дал.
А теперь мы начинаем играть в игру "усложним ТЗ на ходу".

Ну ок, тогда я сделаю в классах процедуру ToXML в которую передам общий XMLModule где и будет все нужное.

Ну на мой взгляд куда проще описать общий для них интерфейс. Тогда даже если ты их не по одиночке будешь передавать и уж тем более не в готовом string виде, а, например, тупо списком интерфейсов или даже списком TObject-в передашь, то твой обработчик пробежится по списку, посмотрит кто поддерживает нужный ему интерфейс и тупо вызовет нужные обработчики уже из себя. Тем более, что обработчику может не только понадобиться уже готовый ответ, а еще и вызов еще каких-либо общих для этих объектов процедур.Это все можно сделать и без интерфейсов.

Хотя, с другой стороны, знаешь, делай так, как написал. Тебе можно ;)Рад что ты с этим не споришь.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620273
Фотография Leonid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЭто все можно сделать и без интерфейсов.Да без всего можно обойтись.
Я тебе даже больше скажу! И без ООП люди до сих пор живут и как-то справляются. На Линухе таких вообще тьма.

Впрочем, я же тебе так и говорил. Это всего лишь удобная возможность, которой очень многие и очень часто сейчас пользуются.
А боязнь использования этого механизма в Дельфях у многих связана лишь с его немного своеобразной древней изначально заточенной под COM имплементацией. Но с такими заглушками как TSingletonImplementation и это не проблема.

Но лично тебя никто не заставляет этим пользоваться. Так же как никто не заставляет тебя пользоваться дженериками и прочим.
Хотя по факту ты ими все равно косвенно пользуешься. Они сейчас везде в библиотеке и в том числе в сторонних библиотеках.

rgreatLeonidХотя, с другой стороны, знаешь, делай так, как написал. Тебе можно ;)Рад что ты с этим не споришь.А чего тут спорить-то? Уже и так все понятно. Вижу, уже даже написали.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620275
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Но лично тебя никто не заставляет этим пользоваться. Так же как никто не заставляет тебя пользоваться дженериками и прочим.
Хотя по факту ты ими все равно косвенно пользуешься. Они сейчас везде в библиотеке и в том числе в сторонних библиотеках.Сколько высокомерия. С коня не свались когда мельницу атакуешь.

P.S. А библиотека дженерик классов у меня даже своя есть.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620277
Фотография Leonid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatP.S. А библиотека дженерик классов у меня даже своя есть.Ну выходит, что практический смысл ты иногда включаешь.
Ну так подождать годик-другой, может и интерфейсы так же полюбишь. Безусловно, сугубо с практической точки зрения и когда это надо
Как знать, как знать... ;)

Ну, бывай, Алешка! Смело бей карбонариев и бусурман!
А вот книжек не читай - это лишнее. От этого только мигрени случаются, да волосы выпадают.
:)
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620280
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid, ну и тебе не кашлять, блондинка. ;)
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620324
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid,

по теме, хреново пахнет это. Обычно надо куда то этот интерфейс передать, а там всё стандартно зашибёшся [Unsafe] вставлять

проще сделать явную реализацию этих трёх злополучных методов (гуид кстати необязательный для интерфейса)

что бы не переходить в критиканство, надёжнее вот так что-то выдать во внешку

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
type
  ISomeInterface = interface
    procedure DoSomething;
  end;

  TSomeClass = class(TObject, ISomeInterface)
  private
    function SomeInterface_QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;

    function SomeInterface__Ref: Integer; stdcall;
    function ISomeInterface.QueryInterface = SomeInterface_QueryInterface;
    function ISomeInterface._AddRef = SomeInterface__Ref;
    function ISomeInterface._Release = SomeInterface__Ref;
  protected
    procedure DoSomething;
  end;

{ TSomeClass }
function TSomeClass.SomeInterface_QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  Result := S_FALSE;
end;

function TSomeClass.SomeInterface__Ref: Integer;
begin
  Result := -1;
end;

procedure TSomeClass.DoSomething;
begin
  Writeln('ok');
end;

procedure AniWork(v: ISomeInterface);
begin
  v.DoSomething();
end;

procedure TestProc;
var
  SC: TSomeClass;
begin
  SC := TSomeClass.Create;
  try
    AniWork(SC);
  finally
    SC.Free;
  end;
end;




ну или с Implements замутить
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620366
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatLeonidrgreat, почему я тебе должен хрестоматийные истины расписывать. Или тебе самому лениво посмотреть?
Вдруг ты мне "глаза откроешь"?

На практике действительно часто либо не имеет смысла и даже вредно, либо принципиально нет возможности создавать иерархию в рамках наследования из одной цепи, но нужен "интерфейс" ( в данном случае можешь понимать "интерфейс" как нечто объединяющее твои возможно весьма разнородные объекты ), который позволит, например, однообразно передавать их в какую-то обобщенную обработку, которая в данном случае не нуждается в знании о всех этих конкретных классах.
Так понятнее? Если нет - читай книжечки про паттерны и прочее.Дык о чем и речь. Область применения интерфейсов в реальной жизни весьма ограничена.
Реализация плагинов: переход через границы DLL, возможность использовать другие языки программирования, которые реализуют возможности интерфейсов C++, C#.
Без интерфейсов такое сделать будет сложно.
Что чушь-то городить.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620379
delphinotes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересный у вас спор.

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
type
  // интерфейс, о котором знает грид:
  ICellEditor = interface
    procedure InitEdit(AGrid: TGrid);
    procedure BeginEdit;
    procedure EndEdit;
    procedure CancelEdit;
    ...
  end;



Допустим я хочу создать редактор на обычном TEdit, пишу свой класс-наследник от TEdit с реализацией интерфейса:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
type
  TSimpleCellEditor = class(TEdit, ICellEditor)
    FGrid: TGrid;
    ..
    // ICellEditor:
    procedure InitEdit(AGrid: TGrid);
    procedure BeginEdit;
    procedure EndEdit;
    procedure CancelEdit;
  end;



Тоже самое без интерфейсов, объявляем абстрактный класс (на уровне грида):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
type
  // интерфейс, о котором знает грид:
  TCellEditor = class
    FGrid: TGrid;
    constructor Create(AGrid: TGrid); virtual;
    procedure BeginEdit; virtual; abstract;
    procedure EndEdit; virtual; abstract;
    procedure CancelEdit; virtual; abstract;
    ...
  end;



И всё равно пишу свой класс:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
type
  TSimpleCellEditor = class(TCellEditor)
  private
    FEdit: TEdit;
    ..
    constructor Create(AGrid: TGrid); override;
    procedure BeginEdit; override;
    procedure EndEdit; override;
    procedure CancelEdit; override;
  end;



А дальше начинаются интересные вещи:
- если интерфейс уже опубликован, то его нельзя менять;
- если реализаций интерфейса несколько - то тяжело найти конкретную реализацию (я про поиск по исходникам);
- порой встречается дублирование кода в каждой из реализаций одного интерфейса (которую можно было бы вынести в абстрактный класс).

Вот если реализовать и то, и другое, и поработать и с тем, и с тем, то тогда реально будет понимание того, надо оно или нет. Я когда только про интерфейсы почитал, да начал пробовать их использовать - тоже сначала думал, что крутая вещь. А время расставило всё по местам.

Для себя я определился, что интерфейсы стоит объявлять:
а) для реализации системы плагинов/когда необходимо взаимодействие с внешними библиотеками (dll)
б) когда необходимо множественное наследование (ну то ещё такое)


Во всех остальных случаях с интерфейсами больше мороки, чем пользы, особенно если у меня "монофайл" и все исходники на руках. И чем крупнее проект, тем сильнее это заметно.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620398
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SAS.Planet был целиком написан на интерфейсах примерно до 2014-го года.
Это был тихий ад и ужас в плане поддержки и сопровождения кода.

Потом аффтар одумался, и переписал всё на ООП.
Код получился гораздо проще
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620413
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто придумал такой скобочный синтаксис?

Код: pascal
1.
2.
var
  [Unsafe] ISI: ISomeInterface; 



ИМХО, труЪ паскаль-код должен быть таким

Код: pascal
1.
2.
var
  ISI: ISomeInterface; unsafe;
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620432
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
КвейдКто придумал такой скобочный синтаксис?

Код: pascal
1.
2.
var
  [Unsafe] ISI: ISomeInterface; 




ИМХО, труЪ паскаль-код должен быть таким

Код: pascal
1.
2.
var
  ISI: ISomeInterface; unsafe;


Язык Паскаль уже давно изговняли
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620448
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдКто придумал такой скобочный синтаксис?

ИМХО, труЪ паскаль-код должен быть таким

Код: pascal
1.
2.
var
  ISI: ISomeInterface; unsafe;


Потому что это атрибуты и просто логика таких как Weak, Unsafe, Default и т.п. вшита в компилятор.
У атрибутов могут быть конструкторы и параметры.
Например
Код: pascal
1.
2.
var
  [WeakMy('Param1', 20)]  ISI: ISomeInterface;
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620538
Nordlys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интерфейсы позволяют реализовывать схемы прозрачного делегирования функционала.
А в Delphi при этом еще можно избежать необходимости перекрестных ссылок и особенно сложных перекрестных ситуаций через несколько модулей, когда это в итоге приводит либо к circular reference либо к серьезному увеличению времени компиляции в большом проекте.

Например, главный класс может содержать поля с объектами делегатов. Это классы, которые выполняют какой-то функционал для главного класса. Главный класс знает все про эти классы, а вот классы делегатов могут находится в других юнитах и не обязаны знать про создавший их главный объект ничего конкретного кроме некого интерфейса объявленного в отдельном общем модуле и который передается им при создании.
В этом случае еще и упрощается создание и работа с такими делегатами из других модулей и классов.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620550
Nordlys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator:
>>> Язык Паскаль уже давно изговняли

На языке Паскаль уже давно никто не пишет, кроме школьников. И то уже редко.
Delphi - это одна из разновидностей Object Pascal.
И можно только порадоваться, что Object Pascal пока еще развивается и старается хоть как-то идти в ногу со временем.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620576
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
NordlysИнтерфейсы позволяют реализовывать схемы прозрачного делегирования функционала.
А в Delphi при этом еще можно избежать необходимости перекрестных ссылок и особенно сложных перекрестных ситуаций через несколько модулей, когда это в итоге приводит либо к circular reference либо к серьезному увеличению времени компиляции в большом проекте.
что, правда, что ли ?
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620684
AWSVladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan) ну или с Implements замутить
Да ты просто СУПЕР!!!!!
Спасибо за идею.
Мучаюсь с древним проектом, пока работает, все пучком, как вносить изменения, особенно оптимизиционные, так ловля блох (потерянные ссылки) больше времени занимает, чем сами изменения.
Блин, еще раз спасибо за идею!!!
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620692
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorчто, правда, что ли ? У нас на риче подобное вылезало. Но он сам очень моструозный
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620700
AWSVladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatОпиши задачи где интерфейсы есть больше смысла применять чем другие инструменты.

И почему.

Хотел дать ссылку, как мне объясняли про интерфейсы, но не нашел.

Тема называлась "Interface - в чем фишка!", опубликовано было в FIDO в октябре 2002 года

Процитирую, что сохранил себе:

Привет коллеги.
Может ктонибудь объяснит в чем фишка исп-я интерфейсов?
Единственное положительное от использования это счетчик ссылок, с
авто-убиением и второе - это обязательное описание методов в классе
(полож-е или отрицательоное :о? )

Пример с животными кот-й везде приводится очень хорошо делается и без
интерфейсов.
Пример:
ТЛетим
- высота полета над ур-м моря, скорость
ТПлаваем
- глубина, пресноводное или в морской воде обитает

Потом объеделяем поведенческие метотоды

ТЛетуноНыряльщик
ТБегуноНыряльщик и т.д.

в нутрях делаем

ТЛетуноНыряльщик = class
private
FЛетим:ТЛетим
FПлывем:ТПлаваем
published
property ВысотаПолета
property ГлубинаПогружения

Потом описываем спокойно животных

ТДельфин=класс(ТМлекопитающее)
private
FЛетуноНыряльщик :ТЛетуноНыряльщик ;
property МеханизмДвижения:ТЛетуноНыряльщик read FЛетуноНыряльщик ;

ТУтка=класс(Птица)
private
FЛетуноНыряльщикБегающий :ТЛетуноНыряльщикБегающий ;
property МеханизмДвижения:ТЛетуноНыряльщикБегающий read
FЛетуноНыряльщикБегающий ;

Все!!!

В одном проперти все методы движения объекта животного.

Так в чем фишка исп-я интерфейсов?
Ненужно делать делегирования методов, они все в одной точке и ОТЛИЧНО
поддаются контролю при программировании.

Или использ-е интерфейсов с исп-м технологии СОМ связано?

А то я что то не врубаюсь :)

AWS

ответы мне в конфу:
авторА теперь представь что у тебя есть объект который занимается управлением
стаи летунов и другой объект который управляет ныряльщиками, причем
написанные не тобой и без исходников. Они подразумевают что все передаваемые
под их начало объекты будут произведены от TЛетун и TНыряльщик
соответственно. Очевидно что TУтка должен быть одновременно и TЛетун и
TНыряльщик и никакие property для этого не подходят. Значит необходимо
множественное наследование, которое есть в C++, но нет в Delphi и VB. Причем
множественное наследование при программировании штука довольно-таки сложная.
Особенно в нетривиальных ситуациях. Вот тут то и помогает интерфейсы. Если
TУтка реализует интерфейсы TЛетун и TНыряльщик то управляющие объекты смогут
с ним работать.

--------------------
Ну тут уже разные люди всякие вещи сказали, я добавлю. Довольно приятная
вещь - запрос интерфейса в runtime. Например, есть у нас объект TVehicle.
Задача - сбить цель! А мы не знаем может ли этот объект сбивать цели.
Поскольку TVehicle, то это может быть и "Мерседес" и "Шилка" и "Урал" и
"Зенитный пулемет смонтированный на Урале".

Но мы недолго думая пишем:

procedure TGunSlinger.EngageTarget(const V:TInterfacedObject);
var
G:IAntiAircraftGun;
begin
if Supports(V,IAntiAircraftGun,G) then
if G.HasAmmo and G.FindTarget then G.FireAtTarget
else
RunAway;
end;

Таким образом нам все равно на чем установлены средства ПВО. Главное что они
есть.


Привет!
Интересный у тебя пример, самый понятливый :)
Т.е. резюме::
1.Экспресс диагностика методов от родителей.
2.Реализация нужных методов, для любого объекта.
Т.е. в моем примере:
Есть множество животных объектов, типа единого массива, со своими интерфейсами.
При захвате этого объета можно реализть такой алгоритм "жизни".

Procedure ОбъектПопалВВоду(ifObj:TInterfacedObject)
begni
If ifObj is IПлаваем then
begin
// реализация плавания
end else
begin
// реализация предсмертного мата и отправки души на небо.
end;
end;


Т.е. если сделать программу - "Животные", и что бы при работе спозиционировавшись на объекте, я мог знать то что реализовано у меня в срезе-интерфейсе? Так?

К примеру
Дельфин - интерфейсы срезы: Вид, место обитания, хищник, ареал популяции (в каких местах нах-ся)

И у каждого есть свои методы получения данных об объекте. Так?


Но ведь у интерфесов нет переменных и как к примеру ты узнаешь от интерфейса, какой калибр и емкость магазина, до какой высоты идет эфф-е поражение цели?

Как узнать не делая второй интерфейс?

AWS



ответы

Talk: Interface - в чем фишка!
Sergey Skorodinsky
Профиль

22 10 2002 20:32 ответить

* Crossposted in RU.DELPHI
Рад пpиветствовать тебя, AWS!

Tuesday October 22 2002 07:45, AWS Владимиp wrote to All:

AВ> Может ктонибyдь объяснит в чем фишка исп-я интеpфейсов?
AВ> Единственное положительное от использования это счетчик ссылок, с
AВ> авто-yбиением и втоpое - это обязательное описание методов в классе
AВ> (полож-е или отpицательоное :о? )

Я использовал интеpфейс как меткy, что класс чем-то особенный (implements
IMyInterface). Что то типа:

{Delphi 5}
type
IMyInterface = interface
['{C3E2EE21-695A-11D5-B2CC-00A0CC26D098}']
end;
.....
var MyI:IMyInterface;
.....
if SomeObject.GetInterface(IMyInterface, MyI) then .. {object is marked}

Пpи этом даже необязательно, что бы в этом интеpфейсе были описаны какие-то
методы. Таким обpазом ты можешь создать свою иеpаpхию интеpфейсов (и даже не
однy) котоpая бyдет сyществовать как бы паpаллельно с иеpаpхией объектов.

А вот насчет использования интефейса для счетчика ссылок я много слышал, но так
и не понимаю, что это такое. Hельзя ли коpоткий пpимеp?

AВ> Пpимеp с животными кот-й везде пpиводится очень хоpошо делается и без
AВ> интеpфейсов.
AВ> Пpимеp:
AВ> ТЛетим
AВ> - высота полета над yp-м моpя, скоpость
AВ> ТПлаваем
AВ> - глyбина, пpесноводное или в моpской воде обитает

AВ> Потом объеделяем поведенческие метотоды

AВ> ТЛетyноHыpяльщик
AВ> ТБегyноHыpяльщик и т.д.

AВ> в нyтpях делаем

Читай в любой ноpмальной книжке по ООП пpо отличия междy is-a and has-a
relationship. По pyсски говоpя - быть кем-то(чем-то) и иметь кого-то (чего-то).
Гyсаpы молчат. То есть отношения владения и отношения наследственности. Очень
хоpошо описано в Бpюс Эккель "Thinking in Java", хоть это и оффтопик, но во
вводной части очень много интеpесного пpо ООП вообще.

AВ> ТЛетyноHыpяльщик = class
AВ> private
AВ> FЛетим:ТЛетим
AВ> FПлывем:ТПлаваем

Типичный has-a. То есть твой летyноныpяльщик владеет какими-то пpопеpтями. Само
по себе это не значит способности летать/ныpять.
Более класически (с интеpфейсами IDiveable и IFlyable, или IDiver и IFlyer)
А yже в этих интеpфейсах должны быть методы соответственно Летать и Hыpять
:-))). А yже твои тваpи (соppи - твои объекты) могyт имплементиpовать эти
интеpфейсы, соответственно имея способности ныpять/летать.

Пpи этом наследоватся в своей иеpаpхии ты можешь от pазных pодителей, не теpяя
пpи этом способности летать. Hапpимеp твой класс ТСамолет и ТВеpтолет могyт
наследоваться от ТМашина, но имплементиpовать интеpфейс IFlyer. Аналогично -
класс TОpел (наследник ТПтичка), Аналогично ТКамень (если бpосить) (наследник
ТМинеpал). Аналогично ТКомаpик (наследник ТBug).

То есть опять же это как бы еще одно измеpение для постpоения твоей иеpаpхии.

[...skip...]

AВ> Потом описываем спокойно животных
AВ> ТДельфин=класс(ТМлекопитающее)
AВ> private
AВ> FЛетyноHыpяльщик :ТЛетyноHыpяльщик ;
AВ> property МеханизмДвижения:ТЛетyноHыpяльщик read FЛетyноHыpяльщик ;

AВ> ТУтка=класс(Птица)
AВ> private
AВ> FЛетyноHыpяльщикБегающий :ТЛетyноHыpяльщикБегающий ;
AВ> property МеханизмДвижения:ТЛетyноHыpяльщикБегающий read
AВ> FЛетyноHыpяльщикБегающий ;

AВ> Все!!!

Пpи этом из твоей иеpаpхии совеpшенно не следyет что yтка может летать, ныpять
и бегать.
А вот из деклаpации TУтка=класс(ТПтица, IFlyer, IRunnable, IDiver) это следyет
опpеделенно. Пpичем опять же - ты можешь в пpогpамме пpовеpить что-то типа

If (твой_Объект имплементиpyет IFlyer) then твой_Объект.полетели

(метод полетели должен быть описан в интеpфейсе IFlyer)

AВ> В одном пpопеpти все методы движения объекта животного.

Так не бывает. Миp многомеpен и летают не только наследники птиц.

Hадеюсь, yвидимся!
Sergey.

... Кyст - это совокyпность палок и веток pастyщих из одного места!

Сообщение в Internet формате

---------------

Re: Interface - в чем фишка!
Kazantsev Alexey
Профиль

23 10 2002 10:45 ответить

Однако, здравствуйте!
> А вот насчет использования интефейса для счетчика ссылок я много слышал,
но так
> и не понимаю, что это такое. Hельзя ли коpоткий пpимеp?

ITransaction имеет методы Start, Commit, RollBack. Назначение понятно? Идем
дальше.

Begin
Trans := TTransaction.Create(DataSet); // Счетчик ссылок увеличивается на
1.
Start;
Commit;
// при выходе из области видимости переменной, счетчик уменьшается на 1 и =
0, при этом объект уничтожается.
End;

В случае возникновения исключительной ситуации внутри Start или Commit,
вылетаем из процедуры. Удаляется объект TTransaction т.к. счетчик ссылок =
0, вызывается его деструктор, где проверяется: если не выполнился Commit то
выполнить Rollback.

Это очень и очень кратко, но использовать удобно :).
__________________________________
Казанцев Алексей (kazav@udmurtneft.ru)





Живое было общение, жаль, что нельзя сейчас опять все перечитать.
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620703
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AWSVladimir,

Вот еще неплохая статья про применение интерфейсов
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=468
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620705
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatLeonidНу а как еще тебя понять?Как написано. Русским по белому.

Если ты очевидные удобства не принимаешь в принципе. Даже когда тебе детально "расжевывают", где это хорошо работает.Не увидел "разжевалки".

А "очевидные удобства" таковы в теории а не на практике. А я практик.
Не ссорьтесь
Сказано же в исходном посте это может быть полезно в некоторых схемах. Я думаю ни кто не будет спорить с тем, что жизнь очень сложна и многогранна, поэтому всегда можно найти задачу под предложенное решение.
Лично я так уже наелся этих ваших ARC-ов по самые ноздри 21154263 .
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620719
AWSVladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
ну или с Implements замутить

А можно попродробнее, что ты имел в виду?
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39620881
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AWSVladimirkealon(Ruslan)
ну или с Implements замутить

А можно попродробнее, что ты имел в виду?

да ничего особого, чуть проще просто при множестве классов

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
type
  TUnknownImplements = class(TObject, IUnknown)
  public
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  end;

  ISomeInterface = interface
    procedure DoSomething;
  end;

  TSomeClass = class(TObject, ISomeInterface)
  private
    function GetUnknown: TUnknownImplements;
    property Unknown: TUnknownImplements read GetUnknown implements ISomeInterface;
  protected
    procedure DoSomething;

  end;

{ TUnknownImplements }

function TUnknownImplements.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  Result := S_FALSE;
end;

function TUnknownImplements._AddRef: Integer;
begin
  Result := -1;
end;

function TUnknownImplements._Release: Integer;
begin
  Result := -1;
end;

{ TSomeClass }
procedure TSomeClass.DoSomething;
begin
   Writeln('ok');
end;

function TSomeClass.GetUnknown: TUnknownImplements;
begin
  Result := nil;
end;

procedure AniWork(v: ISomeInterface);
begin
  v.DoSomething();
end;

procedure TestProc;
var
  SC: TSomeClass;
begin
  SC := TSomeClass.Create;
  try
    AniWork(SC);
  finally
    SC.Free;
  end;
end;
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39621171
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Книга «Психбольница в руках пациентов. Алан Купер об интерфейсах»
Профессиональная литература,
Интерфейсы,
Блог компании Издательский дом «Питер»

Хабр
...
Рейтинг: 0 / 0
Возможность создания новых типов интерфейсов в новых версиях Delphi
    #39621518
AWSVladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
Спасибо, понял.


delphinotesА дальше начинаются интересные вещи:
- если интерфейс уже опубликован, то его нельзя менять;


Можно, если только добавлять методы.
Еще используют с dispinterface индексный доступ, но сам с ним не работал.
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Возможность создания новых типов интерфейсов в новых версиях Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]