Здравствуйте, rrsstio, Вы писали:
R>Что общего между интерфейсом и делегатом
"Delegates and interfaces are similar in that they enable the separation of specification and implementation."
(c) MSDN
Здравствуйте, c-smile, Вы писали:
R>>Что общего между интерфейсом и делегатом
CS>Хороший вопрос. Автору — пять баллов.
CS>delegate (как тип) это такой interface который имеет единственный метод. CS>Т.е ответ на вопрос: делегат это разновидность интерфейса.
Корректнее было бы сказать, что делегат как и интерфейс используются для описания "контракта".
Т.к. формально (с точки зрения .NET) делегат это не интерфейс.
Здравствуйте, 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 — т.е. функция видит
локальные переменные обрамляющей функции. Вот такие вот пироги.
Здравствуйте, 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")
Здравствуйте, c-smile, Вы писали:
C>>Корректнее было бы сказать, что делегат как и интерфейс используются для описания "контракта". C>>Т.к. формально (с точки зрения .NET) делегат это не интерфейс.
CS>Вопрос не специфицировал среду/язык. Делегаты есть во многих языках/средах.
Теоретически наверно так и есть, но могу поспорить, что имелся в виду .NET
Поэтому, чтобы уберечь автора вопроса от конфуза на след. интервью на позицию С# программиста я и написал:
формально (с точки зрения .NET)
P.S. возвращаясь к теории: то, что делегаты сходны по сути с однометодными интерфейсами понятно, но есть ли языки, в которых делегат формально или синтаксически являются интерфейсами?
Здравствуйте, Curufinwe, Вы писали:
C>P.S. возвращаясь к теории: то, что делегаты сходны по сути с однометодными интерфейсами понятно, но есть ли языки, в которых делегат формально или синтаксически являются интерфейсами?
С++ например.
Функторы — т.е. объекты с определенным operator() фактически и есть интерфейсы-делегаты.
Нечто типа:
Спор 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 (насколько я понимаю).
Здравствуйте, c-smile, Вы писали:
CS>С++ например.
CS>Функторы — т.е. объекты с определенным operator() фактически и есть интерфейсы-делегаты. 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();
}
}
Здравствуйте, 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>>
Здравствуйте, c-smile, Вы писали:
CS>Спор closures они или нет еще не окончен как я понимаю. CS>В момент образования closure C# генерирует объект класса (object, sic!) в котором содержится snapshot значений используемых переменных окружения на момент образования closure. CS>В Python или JavaScript closure отличается тем что closure содержит ссылку на список call frames.
Значит ли это, что никакая локальная переменная этого call frame-а не будет доступна для сборщика мусора?
Здравствуйте, c-smile, Вы писали:
CS>interface в программированнии и в широком смысле есть спецификация (или "контракт" как справедливо заметил Curufinwe) некоего набора CS>методов доступа к объекту.
В программировании, широком смысле, то что ты имеешь ввиду (спецификация некоего набора методов доступа к объекту), называется "публичный контракт". interface же — частный случай публичного контракта выраженный в терминах конкретного языка или группы языков, в данном случае — .Net
Иногда, слово интерфейс употребляют в смысле "публичный контракт", но так как вопрос был задан про NET, а там у понятия interface есть своя собственная трактовка и конкретная физическая реализация, то употреблять его в качестве синонима термину "публичный контракт", как минимум не корректно.
К тому же в вопросе слово интерфейс упоминалось вовсе не в "философском" смысле.
CS>Т.е. делегат есть частный случай интерфейса, т.е. delegate is-a interface в философическом смысле этого слова (вопрос был задан в "Философии", а не в ".NET")
Философский смысл слова интерфейс называется "публичный контракт".
P. S.
А я то здесь причем? В философском смысле и Net-овский интерфейс и делегат позволяют отделить описание сущности от ее реализации, что собственно и написано в MSDN. И, заметь, в этом определении нет не интерфейсов, ни контрактов.. ))
Здравствуйте, 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) происходит вызов:
который снимает 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 нет!
Здравствуйте, 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 нотацию — там это можно сделать но "руками".
Вопрос в личных предпочтениях — кто-то предпочитает писать с понятием как оно унутре устроено, а кому-то достаточно высокоуровневых конструкций (которые имеют свою цену).
Здравствуйте, c-smile, Вы писали:
CS>Что значит "доступна для сборщика мусора"? Если это означает "Может ли GC освободить эту переменную?" то ответ "нет"
Здравствуйте, c-smile, Вы писали:
CS>То же самое можно воспроизвести в C++. Никто не говорит что C++ поддерживает functional нотацию — там это можно сделать но "руками".
Так вот "поддерживает" — это когда не надо "можно сделать но "руками""
CS>Вопрос в личных предпочтениях — кто-то предпочитает писать с понятием как оно унутре устроено, а кому-то достаточно высокоуровневых конструкций (которые имеют свою цену).
Я выбираю третий путь — высокоуровневые конструкции + понимание, как оно "унутре".