Вопрос одного интервью
От: rrsstio  
Дата: 12.03.08 15:18
Оценка:
Что общего между интерфейсом и делегатом
Re: Вопрос одного интервью
От: nikov США http://www.linkedin.com/in/nikov
Дата: 12.03.08 15:21
Оценка:
Здравствуйте, rrsstio, Вы писали:

R>Что общего между интерфейсом и делегатом


1) И то, и то — ссылочные типы
2) Оба позволяют организовать передачу объекта, инкапсулирующего какой-либо алгоритм
Re: Вопрос одного интервью
От: c-smile Канада http://terrainformatica.com
Дата: 12.03.08 15:47
Оценка: +1 -2
Здравствуйте, rrsstio, Вы писали:

R>Что общего между интерфейсом и делегатом


Хороший вопрос. Автору — пять баллов.

delegate (как тип) это такой interface который имеет единственный метод.
Т.е ответ на вопрос: делегат это разновидность интерфейса.
Re: Вопрос одного интервью
От: IB Австрия http://rsdn.ru
Дата: 12.03.08 16:30
Оценка: 3 (1) +6
Здравствуйте, rrsstio, Вы писали:

R>Что общего между интерфейсом и делегатом

"Delegates and interfaces are similar in that they enable the separation of specification and implementation."
(c) MSDN
Мы уже победили, просто это еще не так заметно...
Re[2]: Вопрос одного интервью
От: Curufinwe Украина  
Дата: 12.03.08 16:48
Оценка: +2
Здравствуйте, c-smile, Вы писали:

R>>Что общего между интерфейсом и делегатом


CS>Хороший вопрос. Автору — пять баллов.


CS>delegate (как тип) это такой interface который имеет единственный метод.

CS>Т.е ответ на вопрос: делегат это разновидность интерфейса.

Корректнее было бы сказать, что делегат как и интерфейс используются для описания "контракта".
Т.к. формально (с точки зрения .NET) делегат это не интерфейс.
... << RSDN@Home 1.2.0 alpha rev. 693>>
Re[3]: Вопрос одного интервью
От: c-smile Канада http://terrainformatica.com
Дата: 12.03.08 21:23
Оценка: 1 (1)
Здравствуйте, Curufinwe, Вы писали:

C>Здравствуйте, c-smile, Вы писали:


R>>>Что общего между интерфейсом и делегатом


CS>>Хороший вопрос. Автору — пять баллов.


CS>>delegate (как тип) это такой interface который имеет единственный метод.

CS>>Т.е ответ на вопрос: делегат это разновидность интерфейса.

C>Корректнее было бы сказать, что делегат как и интерфейс используются для описания "контракта".

C>Т.к. формально (с точки зрения .NET) делегат это не интерфейс.

Вопрос не специфицировал среду/язык. Делегаты есть во многих языках/средах.

С точки зрения языков в которых есть абстаркция делегатов delegate instance есть tuple:
object/method-ref. object может быть optional — вырожденный случай function reference.

interface instance есть тоже tuple: object/vtbl(список функций). В случае когда интерфейс состоит
из одной функции имеем vtbl состящую из одной функции т.е. фактически object/method-ref.

ЧТД.

Для интересующихся: в языке D делегатом также может быть ссылка на вложенную функцию. В этом случае образование
делегата этой функции это создание closure — object в том tuple это какскад stack frames — т.е. функция видит
локальные переменные обрамляющей функции. Вот такие вот пироги.

В JavaScript делегаты делаются сходным образом:
http://www.terrainformatica.com/?p=9
http://www.terrainformatica.com/?p=13
Re[2]: Вопрос одного интервью
От: c-smile Канада http://terrainformatica.com
Дата: 12.03.08 21:40
Оценка: +1
Здравствуйте, IB, Вы писали:

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


R>>Что общего между интерфейсом и делегатом

IB>"Delegates and interfaces are similar in that they enable the separation of specification and implementation."
IB>(c) MSDN

interface в программированнии и в широком смысле есть спецификация (или "контракт" как справедливо заметил Curufinwe) некоего набора
методов доступа к объекту. delegate это спецификация одного метода доступа — т.е. фактически интрфейса состоящего из одного метода.
Т.е. делегат есть частный случай интерфейса, т.е. delegate is-a interface в философическом смысле этого слова (вопрос был задан в "Философии", а не в ".NET")
Re[4]: Вопрос одного интервью
От: Curufinwe Украина  
Дата: 12.03.08 22:17
Оценка:
Здравствуйте, c-smile, Вы писали:

C>>Корректнее было бы сказать, что делегат как и интерфейс используются для описания "контракта".

C>>Т.к. формально (с точки зрения .NET) делегат это не интерфейс.

CS>Вопрос не специфицировал среду/язык. Делегаты есть во многих языках/средах.


Теоретически наверно так и есть, но могу поспорить, что имелся в виду .NET
Поэтому, чтобы уберечь автора вопроса от конфуза на след. интервью на позицию С# программиста я и написал:

формально (с точки зрения .NET)


P.S. возвращаясь к теории: то, что делегаты сходны по сути с однометодными интерфейсами понятно, но есть ли языки, в которых делегат формально или синтаксически являются интерфейсами?

P.P.S в С# тоже есть closures.
Re[5]: Вопрос одного интервью
От: c-smile Канада http://terrainformatica.com
Дата: 13.03.08 02:02
Оценка: 1 (1)
Здравствуйте, Curufinwe, Вы писали:

C>P.S. возвращаясь к теории: то, что делегаты сходны по сути с однометодными интерфейсами понятно, но есть ли языки, в которых делегат формально или синтаксически являются интерфейсами?


С++ например.

Функторы — т.е. объекты с определенным operator() фактически и есть интерфейсы-делегаты.
Нечто типа:

struct delegate
{
  virtual void operator()(...) = 0; 
}


C>P.P.S в С# тоже есть closures.


Спор closures они или нет еще не окончен как я понимаю.
В момент образования closure C# генерирует объект класса (object, sic!) в котором содержится snapshot значений используемых переменных окружения на момент образования closure.
В Python или JavaScript closure отличается тем что closure содержит ссылку на список call frames.

Попробуй вот этот документ загрузить в browser:
<html>
  <script>
  function A() 
  {
    var a = 28;
    function B() { a += 32; } 
    function C() { return a; }
    return [B,C]; 
  }
  var v = A();
  v[0]();
  var r = v[1](); 
  alert(r); 
  </script>
<body></body>
</html>


Должен сказать 60.

В С# аналогичная конструкция должна сказать 28 (насколько я понимаю).

И вообще что есть true closure — вопрос открытый.
Re[6]: Вопрос одного интервью
От: Curufinwe Украина  
Дата: 13.03.08 06:58
Оценка: 32 (1)
Здравствуйте, c-smile, Вы писали:

CS>С++ например.


CS>Функторы — т.е. объекты с определенным operator() фактически и есть интерфейсы-делегаты.

CS>Нечто типа:

CS>
CS>struct delegate
CS>{
CS>  virtual void operator()(...) = 0; 
CS>}
CS>


скорее это довольно неудачная попытка эмуляции делегата
К тому же я спрашивал именно про языки с формальной поддержкой интерфейсов/делегатов на уровне языка (в С++ ни того ни другого нет).
Предлагаю не начинать очередную ветку типа является ли С++ функциональным языком

CS>Спор closures они или нет еще не окончен как я понимаю.

CS>В момент образования closure C# генерирует объект класса (object, sic!) в котором содержится snapshot значений используемых переменных окружения на момент образования closure.
CS>В Python или JavaScript closure отличается тем что closure содержит ссылку на список call frames.

CS>Попробуй вот этот документ загрузить в browser:

CS>
CS><html>
CS>  <script>
CS>  function A() 
CS>  {
CS>    var a = 28;
CS>    function B() { a += 32; } 
CS>    function C() { return a; }
CS>    return [B,C]; 
CS>  }
CS>  var v = A();
CS>  v[0]();
CS>  var r = v[1](); 
CS>  alert(r); 
CS>  </script>
CS><body></body>
CS></html>


CS>Должен сказать 60.

CS>В С# аналогичная конструкция должна сказать 28 (насколько я понимаю).

Неверное предположение:

class Program
    {
        private static void A(out Action B, out Func<int> C)
        {
            var a = 28;
            B = () => { a += 32; };
            C = () => a;
        }

        static void Main(string[] args)
        {
            Action B;
            Func<int> C;
            A(out B, out C);

            B();
            var r = C();
        }
    }


, даёт r = 60;
Re[6]: Вопрос одного интервью
От: Lloyd Россия  
Дата: 13.03.08 08:12
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>В С# аналогичная конструкция должна сказать 28 (насколько я понимаю).


Неправильно ты понимаешь.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[6]: Вопрос одного интервью
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.08 08:23
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>В момент образования closure C# генерирует объект класса (object, sic!) в котором содержится snapshot значений используемых переменных окружения на момент образования closure.


Нет там никакого снапшота. Если локальная переменная используется внутри замыкания, она с самого начала хранится в этом самом специальном объекте, в том числе и до запуска метода с замыканием.
... << RSDN@Home 1.2.0 alpha 3 rev. 883 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[6]: Вопрос одного интервью
От: Lloyd Россия  
Дата: 13.03.08 08:26
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Спор closures они или нет еще не окончен как я понимаю.

CS>В момент образования closure C# генерирует объект класса (object, sic!) в котором содержится snapshot значений используемых переменных окружения на момент образования closure.
CS>В Python или JavaScript closure отличается тем что closure содержит ссылку на список call frames.

Значит ли это, что никакая локальная переменная этого call frame-а не будет доступна для сборщика мусора?
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[3]: Вопрос одного интервью
От: IB Австрия http://rsdn.ru
Дата: 13.03.08 12:45
Оценка: +1
Здравствуйте, c-smile, Вы писали:

CS>interface в программированнии и в широком смысле есть спецификация (или "контракт" как справедливо заметил Curufinwe) некоего набора

CS>методов доступа к объекту.
В программировании, широком смысле, то что ты имеешь ввиду (спецификация некоего набора методов доступа к объекту), называется "публичный контракт". interface же — частный случай публичного контракта выраженный в терминах конкретного языка или группы языков, в данном случае — .Net
Иногда, слово интерфейс употребляют в смысле "публичный контракт", но так как вопрос был задан про NET, а там у понятия interface есть своя собственная трактовка и конкретная физическая реализация, то употреблять его в качестве синонима термину "публичный контракт", как минимум не корректно.
К тому же в вопросе слово интерфейс упоминалось вовсе не в "философском" смысле.

CS>Т.е. делегат есть частный случай интерфейса, т.е. delegate is-a interface в философическом смысле этого слова (вопрос был задан в "Философии", а не в ".NET")

Философский смысл слова интерфейс называется "публичный контракт".

P. S.
А я то здесь причем? В философском смысле и Net-овский интерфейс и делегат позволяют отделить описание сущности от ее реализации, что собственно и написано в MSDN. И, заметь, в этом определении нет не интерфейсов, ни контрактов.. ))
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Re[7]: Вопрос одного интервью
От: c-smile Канада http://terrainformatica.com
Дата: 13.03.08 17:49
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, c-smile, Вы писали:


CS>>Спор closures они или нет еще не окончен как я понимаю.

CS>>В момент образования closure C# генерирует объект класса (object, sic!) в котором содержится snapshot значений используемых переменных окружения на момент образования closure.
CS>>В Python или JavaScript closure отличается тем что closure содержит ссылку на список call frames.

L>Значит ли это, что никакая локальная переменная этого call frame-а не будет доступна для сборщика мусора?


Что значит "не будет доступна"? GC всегда сканирует stack и heap ...

В tiscript например при обработке байткода BC_CLOSE (образование closure) происходит вызов:
value UnstackEnv(VM *c,value env)

http://code.google.com/p/tiscript/source/browse/trunk/int/cs_int.cpp

который снимает call frames (execution environment) со стека и перемещает их в heap — т.е.
несколько функций вложенных в один и тот же родитель "шарят" один единственный набор переменных родителя.

В принципе в tiscript (и в Python и в JavaScript) на этом можно строить достаточно нетривиальные конструкции.

Например вот объект с strictly private переменными:

function MyObjFactory() 
{
  var m_one = 1;
  var m_two = 2;
  return {    
    getOne: function() { return m_one; }, 
    setOne: function(v) { m_one = v; }
  };
} 

var obj = MyObjFactory();

obj.setOne( 3 ); // другого способа изменить m_one нет!
Re[8]: Вопрос одного интервью
От: Lloyd Россия  
Дата: 13.03.08 18:14
Оценка:
Здравствуйте, c-smile, Вы писали:


CS>Например вот объект с strictly private переменными:


CS>
CS>function MyObjFactory() 
CS>{
CS>  var m_one = 1;
CS>  var m_two = 2;
CS>  return {    
CS>    getOne: function() { return m_one; }, 
CS>    setOne: function(v) { m_one = v; }
CS>  };
CS>} 

CS>var obj = MyObjFactory();

CS>obj.setOne( 3 ); // другого способа изменить m_one нет!
CS>


Что будет с m_two? Она будет доступна для сборщика мусора или нет?
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[7]: Вопрос одного интервью
От: c-smile Канада http://terrainformatica.com
Дата: 13.03.08 18:42
Оценка:
Здравствуйте, Curufinwe, Вы писали:

CS>>Должен сказать 60.

CS>>В С# аналогичная конструкция должна сказать 28 (насколько я понимаю).

C>Неверное предположение:


C>
C>class Program
C>    {
C>        private static void A(out Action B, out Func<int> C)
C>        {
C>            var a = 28;
C>            B = () => { a += 32; };
C>            C = () => a;
C>        }

C>        static void Main(string[] args)
C>        {
C>            Action B;
C>            Func<int> C;
C>            A(out B, out C);

C>            B();
C>            var r = C();
C>        }
C>    }
C>


C>, даёт r = 60;


Это тогда означает что фактически конструкция:

private static void A(out Action B, out Func<int> C)
{
   var a = 28;
   B = () => { a += 32; };
   C = () => a;
}


должна компилятором трансформируется в:

private static void A(out delegate void B(), out delegate int C())
{
   class _tempC 
   { 
     var a = 28;
     void B () { a += 32; }
     int  C () { return a; }
   }
   var _temp = new _tempC();
   B = _temp.B;  
   C = _temp.C;  
}


Я правильно понимаю? Т.е. вместо набора переменных на стеке он(компилятор) должен образовать класс, его instance и два делегата (interface slice) от методов этого инстанса.

То же самое можно воспроизвести в C++. Никто не говорит что C++ поддерживает functional нотацию — там это можно сделать но "руками".
Вопрос в личных предпочтениях — кто-то предпочитает писать с понятием как оно унутре устроено, а кому-то достаточно высокоуровневых конструкций (которые имеют свою цену).
Re[9]: Вопрос одного интервью
От: c-smile Канада http://terrainformatica.com
Дата: 13.03.08 19:05
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Что будет с m_two? Она будет доступна для сборщика мусора или нет?


Что значит "доступна для сборщика мусора"? Если это означает "Может ли GC освободить эту переменную?" то ответ "нет"

Если написать вот так:
function MyObjFactory() 
{
  var m_one = 1;
  {
    var m_two = 2;
    m_one += m_two;
  }  
  return {    
    getOne: function() { return m_one; }, 
    setOne: function(v) { m_one = v; }
};


то GC её и увидеть не успеет — она сбросится со стека до return.
Re[10]: Вопрос одного интервью
От: Lloyd Россия  
Дата: 13.03.08 19:52
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Что значит "доступна для сборщика мусора"? Если это означает "Может ли GC освободить эту переменную?" то ответ "нет"


Спасибо. Плохо.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[8]: Вопрос одного интервью
От: Lloyd Россия  
Дата: 13.03.08 20:00
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>То же самое можно воспроизвести в C++. Никто не говорит что C++ поддерживает functional нотацию — там это можно сделать но "руками".


Так вот "поддерживает" — это когда не надо "можно сделать но "руками""

CS>Вопрос в личных предпочтениях — кто-то предпочитает писать с понятием как оно унутре устроено, а кому-то достаточно высокоуровневых конструкций (которые имеют свою цену).


Я выбираю третий путь — высокоуровневые конструкции + понимание, как оно "унутре".
... << RSDN@Home 1.2.0 alpha rev. 786>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.