Re[21]: Функциональные типы (параллельная ветка)
От: gbear Россия  
Дата: 29.06.05 09:25
Оценка: +1
День добрый... Пожалуй и я со своими тараканами влезу...

Здравствуйте, eao197, Вы писали:

E>Ага. Предположим у тебя есть объект типа TextFormatter и объект типа DiskFormatter. У обоих есть метод void format(). Захотел бы ты получить делегат, который вызывает метод format у неизвестно какого объекта? Прямо как русская рулетка -- либо текст отфоматирует, либо диск, на котором этот текст должен лежать.


E>Но даже для таких извращенцев в C++ есть способы получить удовольствие:

Код поскипан...

Вы будете смеятся, но... вот как сие "удовольствие" выглядит на C#


using System;

namespace ConsoleApplication
{

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

    class Drive
    {
        public void Format()
        {
            Console.WriteLine("Format drive");
        }
    }

    class Text
    {
        public void Format()
        {
            Console.WriteLine("Format text");
        }
    }

    class MainClass
    {
        [STAThread]
        static void Main(string[] args)
        {
            Drive c = new Drive();
            Text t = new Text();
            new FormatDelegate(c.Format)(); //Вызвали формат Drive.C
            new FormatDelegate(t.Format)(); // И тут же отворматировали текст
            (new FormatDelegate(c.Format) + new FormatDelegate(t.Format))()// А тут вызвали сразу и то и другое...;
            Console.ReadLine();
        }
    }
}



E>>> Делегат же, насколько я понял из твоих объяснений, это тот же указатель, который намертво связан с конкретным объектом. Поэтому применить делегат к другому объекту этого же типа уже не реально (правильно?).


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


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


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

---
С уважением, Сиваков Константин.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.