|
|
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
Для тех, кто регулярно штудирует дельфийские 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. В данном случае можем рассматривать ISI: ISomeInterface как просто своеобразный облегченный Pointer на интерфейс с поддержкой от компилятора. !!! Но, если вместо Код: plaintext Код: plaintext ИМХО: Как по мне так это очередной баг компилятора. Если уж для 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. !!! 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-интерфейса вы получите обычный и можете об этом и не узнать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 16:10 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
1. В топку интерфейсы. 2. В топку ARC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 16:37 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
rgreat1. В топку интерфейсы. 2. В топку ARC. человек столько писал и офармлял а ты взял и сказал как отрезал . Нельзя же так с человеками - уважай их труд а то они писать перестанут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 17:01 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
rgreat1. В топку интерфейсы. 2. В топку ARC.А в след за ними в топку и старых заскорузлых отшельников-староверов aka rgreat. Бо оне дюже мешаютЪ юным отрокам постигать что-то новое и диковинно-заморское. Поелику интерфейсы они суть благо великое, ежели их православно уготовати, аки они суть в диковинных поделках на C#. ( так даже деду rgreat-у будет понятнее ) ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 19:09 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
Leonid, Я помоложе многих тут буду. А интерфейсы в дельфях с незапамятных времен есть. Что не мешает им быть весьма спорным инструментом вне узкого круга задач. Так что с ретроградностью ты мимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 19:49 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 19:54 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
rgreatЯ помоложе многих тут буду. А интерфейсы в дельфях с незапамятных времен есть. Что не мешает им быть весьма спорным инструментом вне узкого круга задач. Так что с ретроградностью ты мимо.Возраст он часто в голове. Нередко можно встретить и по-старчески кряхтящих подростков. Особенно часто такие встречаются среди "ботаников". Интерфейсы же сами по себе это очень полезный инструмент. А-то что он в Дельфях изначально был создан для поддержки COM и поэтому и изначально отягощен явным заданием GUID и поддержкой RefCount - это издержки данной старинной реализации. Поэтому-то уже давно все и выкручивались с помощью заглушек на _AddRef и _Release как в TSingletonImplementation. Хотя, возможно нужно было бы просто давно ввести новый тип. Что-нибудь типа "simpleinterface" и все было бы идеологически куда проще. Пока же имеем, что имеем. Зато вот появляются такие вещи как экзотические для найтива "самообнуляемые интерфейсы". В любом случае: не хочешь - не пользуйся. Только когда сама библиотека давно использует интерфейсы вдоль и поперек, говорить что-то типа "в топку интерфейсы" - это как бессмысленно в лужу пер... ;) ( кстати defecator в этом всегда мастер ;) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 21:24 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
Опиши задачи где интерфейсы есть больше смысла применять чем другие инструменты. И почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 22:13 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
rgreatОпиши задачи где интерфейсы есть больше смысла применять чем другие инструменты. И почему. Например Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 22:20 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
asviridenkovrgreatОпиши задачи где интерфейсы есть больше смысла применять чем другие инструменты. И почему. Например Код: pascal 1. Дык, уже куча классов имеет энумераторы. Интерфейсы зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 22:23 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
Если это нужно именно как самоочищающийся результат функции у себя для этого использую TArrayEx<T>. У него и энумератор есть и самоубъется он сам при выходе из процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 22:27 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
rgreatОпиши задачи где интерфейсы есть больше смысла применять чем другие инструменты. И почему.rgreat, почему я тебе должен хрестоматийные истины расписывать. Или тебе самому лениво посмотреть? В паре/тройке предложений: interface - это явное отделение собственно "интерфеса" класса от его непосредственной реализации при котором не нужно опираться на единую ветвь наследования. Особенно когда наследование по одной ветви может являться нарушением инкапсуляции либо вообще не возможно или бессмысленно в рамках некоторой архитектуры. На практике действительно часто либо не имеет смысла и даже вредно, либо принципиально нет возможности создавать иерархию в рамках наследования из одной цепи, но нужен "интерфейс" ( в данном случае можешь понимать "интерфейс" как нечто объединяющее твои возможно весьма разнородные объекты ), который позволит, например, однообразно передавать их в какую-то обобщенную обработку, которая в данном случае не нуждается в знании о всех этих конкретных классах. Так понятнее? Если нет - читай книжечки про паттерны и прочее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 23:07 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
rgreatasviridenkovпропущено... Например Код: pascal 1. Дык, уже куча классов имеет энумераторы. Интерфейсы зачем? Есть некий метод который внутри что-то умеет делать с классом реализующим интерфейс энумератор... Какой класс передан неважно, важно что он реализует интерфейс... Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 23:31 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
Leonidrgreat, почему я тебе должен хрестоматийные истины расписывать. Или тебе самому лениво посмотреть? Вдруг ты мне "глаза откроешь"? На практике действительно часто либо не имеет смысла и даже вредно, либо принципиально нет возможности создавать иерархию в рамках наследования из одной цепи, но нужен "интерфейс" ( в данном случае можешь понимать "интерфейс" как нечто объединяющее твои возможно весьма разнородные объекты ), который позволит, например, однообразно передавать их в какую-то обобщенную обработку, которая в данном случае не нуждается в знании о всех этих конкретных классах. Так понятнее? Если нет - читай книжечки про паттерны и прочее.Дык о чем и речь. Область применения интерфейсов в реальной жизни весьма ограничена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 23:47 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
X-CiteЕсть некий метод который внутри что-то умеет делать с классом реализующим интерфейс энумератор... Какой класс передан неважно, важно что он реализует интерфейс... Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. И зачем ради этого такие сложности городить? Чаще всего в жизни эти самые "List,Queue,DataSet,Form" будут рождены от общего родителя. Ибо если нет, то и скорей всего этот самый Some.Test - скорей вскего будет некой синтетической, и никому реально не нужной процедурой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 23:50 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
Ну или так проще сделать интерфейсов: Код: pascal 1. 2. 3. 4. Где - Test - это некий общий тип. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 23:53 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
*без интерфейсов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 23:59 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
rgreatВдруг ты мне "глаза откроешь"? Дык о чем и речь. Область применения интерфейсов в реальной жизни весьма ограничена. "Глупый ты, Лешка, – улыбнулся полковник. – Прямо беда с тобой. Ты бы хоть книжку какую-нибудь прочитал. - А зачем, Иван Антонович? - Хотя, правильно. Тебе может и не к чему." (с) "О бедном гусаре замолвите слово". Я могу, например, предположить, что либо сложность проектов, с которыми ты пока сталкивался не велика, либо у тебя могут быть серьезные костыли с проектированием больших проектов, либо это твои собственный подход. Но опять же, лично ты можешь не пользоваться какой-либо возможностью или "механизмом" и вполне себе жить и без этого. Либо по неумению/незнанию, либо по принципиальному нежеланию. В любом случае - тогда это лично твои тараканы и обсуждать их мы не будем. Примеры же повсеместного использования интерфейсов ты можешь найти как в самой дельфийской библиотеке, так и во множестве сторонних проектов. Более того, есть вполне серьезные и резонные измышления о большой полезности "интерфейсного" подхода в проектировании. Но возможность и полезность - это не значит необходимость. Поэтому лично тебя никто не заставляет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2018, 00:25 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
Leonid "Глупый ты, Лешка, – улыбнулся полковник. – Прямо беда с тобой. Ты бы хоть книжку какую-нибудь прочитал. - А зачем, Иван Антонович? - Хотя, правильно. Тебе может и не к чему." (с) "О бедном гусаре замолвите слово". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2018, 00:33 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
rgreatЧаще всего в жизни эти самые "List,Queue,DataSet,Form" будут рождены от общего родителя.От какого общего родителя они будут рождены? Ну разве что от TObject-а У тебя что все объекты в твоих собственных иерархиях в рамках только одной ветви наследуются? Если так - то это "тихий ужас". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2018, 00:35 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
LeonidУ тебя что все объекты в твоих собственных иерархиях в рамках только одной ветви наследуются? Если так - то это "тихий ужас".Там пошутил, сам посмеялся. Молодец. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2018, 00:41 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
rgreatОк, я понял. У тебя талант говорить глупости с умным видом. По сути ничего не сказано.Тебе по сути я уже сказал. Тебе даже простенький пример привели. И как раз твои возражения по этому примеру и вызывают вопросики... ;) Ну еще как пример могу тебе привести, что чисто с прикладной точки зрения ( без каких-то рассуждалок о проектировании ) ты, например, можешь использовать единый интерфейс для сохранения в XML/JSON или еще куда своих разнородных ( не наследуемых от одного предка ) объектов. При этом процедурка не обязана вообще ничего знать о твоих объектах, а только об одном их общем интерфейсике. Еще раз тебе говорю - это будет удобная возможность, а не обязанность. Так же как ты, например, можешь и не пользоваться удобством обобщенных списков, а писать все на TList-ах и заниматься приведением. Ты просто не будешь пользоваться более удобным в данном случае "механизмом". Вот и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2018, 00:48 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
rgreatLeonidУ тебя что все объекты в твоих собственных иерархиях в рамках только одной ветви наследуются? Если так - то это "тихий ужас".Там пошутил, сам посмеялся. Молодец.Ну а как еще тебя понять? Если ты очевидные удобства не принимаешь в принципе. Даже когда тебе детально "расжевывают", где это хорошо работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2018, 00:51 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
LeonidТебе по сути я уже сказал. Тебе даже простенький пример привели. И как раз твои возражения по этому примеру и вызывают вопросики... ;)Меньше софистики, больше конкретики. Ну еще как пример могу тебе привести, что чисто с прикладной точки зрения ( без каких-то рассуждалок о проектировании ) ты, например, можешь использовать единый интерфейс для сохранения в XML/JSON или еще куда своих разнородных ( не наследуемых от одного предка ) объектов. При этом процедурка не обязана вообще ничего знать о твоих объектах, а только об одном их общем интерфейсике.Подставь вместо "интерфейсика" общий "классик" для экспорта данных в XML/JSON и ничего по сути не изменится. Еще раз тебе говорю - это будет удобная возможность, а не обязанность.И слава богу. Так же как ты, например, можешь и не пользоваться удобством обобщенных списков, а писать все на TList-ах и заниматься приведением. Ты просто не будешь пользоваться более удобным в данном случае "механизмом". Вот и все. Удобство интерфейсов часто в лучшем случае субъективно. А в реальности концов потом в чужом коде концов не найти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2018, 00:58 |
|
||
|
Возможность создания новых типов интерфейсов в новых версиях Delphi
|
|||
|---|---|---|---|
|
#18+
LeonidНу а как еще тебя понять?Как написано. Русским по белому. Если ты очевидные удобства не принимаешь в принципе. Даже когда тебе детально "расжевывают", где это хорошо работает.Не увидел "разжевалки". А "очевидные удобства" таковы в теории а не на практике. А я практик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2018, 01:00 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39620259&tid=2041083]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
140ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 401ms |

| 0 / 0 |
