Re[22]: Функциональные типы (параллельная ветка)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 29.06.05 09:50
Оценка: 6 (2)
Здравствуйте, gbear, Вы писали:

G>День добрый... Пожалуй и я со своими тараканами влезу...


Милости просим

G>
G>using System;

G>namespace ConsoleApplication
G>{

G>    public delegate void FormatDelegate(); //Сие есть ни что иное, как указатель на метод без привязки к экземпляру. В Вашем понимании, конечно.
        // В моем понимании это аналог typedef в C++, т.е. тип указателя.
...
G>}
G>



VD>>>Делегат — это ссылочный тип. Переменная типа делегат может указывать на любыее методы любых объектов. Так что функционально ты ничем не связан. Делегат же можно рассматривать как указатель на метод. Причем не только на метод эеземпляра. Он точно так же может указывать и на статический метод.


E>>Влад, я уже устал спрашивать: может ли быть делегат, который нужно связать с нестатическим методом объекта, без самого объекта?


G>См. код выше... Я думаю, что Влад просто уже устал повторять, что делегат это ТИП, и с этой точки зрения он как раз и не связан ни с каким экземпляром другого типа. Но экземпляр делегата конкретного типа, должен быть связан с объектом (исключая связь со статическими методами). Т.к. иначе, что Вы собераетесь через него "дергать, имея лишь "голую" ссылку на метод...


Ok. Давайте будем для четкости использовать "тип делегата" и "экземпляр делегата" (равно как "тип указателя на метод" и "экземпляр указателя на метод").

Так вот я прекрасно понимаю, что "тип делегата" никак не связан к конкретным экземпляром объекта (так же, как и тип указателя на метод). Но вот экземпляр делегата (как мне уже объяснил AndrewVK) может быть либо связан со статическим методом, либо с нестатическим методом конкретного объекта (т.е., экземпляр делегата связан с конкретным объектом). Но не может быть экземпляра делегата, связанного с нестатическим методом, но не имеющего объекта. А это означает, что если в твоем примере мы создали экземпляр делегата для t.Format(), то связать этот же делегат с c.Format() мы уже не сможем. Так же мы не сможем сделать делегат для вызова метода Format у любого неизвестного пока объекта типа Text.

А вот в C++ мы можем создать экземпляр указателя на метод Format объектов типа Text, не имея самого объекта этого типа. И затем использовать этот указатель для вызова метода Format у любого объекта типа Text без пересоздания самого экземпляра указателя на метод.

И именно поэтому я считаю, что механизм указателей на методы в C++ является более общим, т.к. он:

1) позволяет как связать указатель с конкретным объектом (посредством дополнительных оберток, как в моем примере или средствами boost-а),

2) создавать экземпляр указателя на конкретный нестатический метод без наличия самого объекта.

В C# п.1 получается автоматом, т.к. для этого есть поддержка со стороны компилятора. В C++, можно сказать, такая поддержка так же есть со стороны boost.

А вот как получить реализацию п.2 в C#?

PS

Просьба не апелировать к тому, что экземпляры указателей на методы без объектов не нужны. Я их использую, значит мне нужны. И, имхо, их использую не только я.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.