Поддерживает ли C# 4.0 ExpandoObjectPrototype-based inheritance? Если нет, то почему (по дизайну?) И как это можно реализовать? Если да, то как это работает и какие различия существуют по сравнению с тем, как он работает в Javascript?Поддерживает ли расширение C# 4.0 ExpandoObject основанное на прототипе наследование?
ответ
Поддерживает ли поддержка C# 4.0 ExpandoObject основанное на прототипе наследование?
Прежде всего, обратите внимание, что класс ExpandoObject не имеет ничего общего с C# 4.0. Команда C# не проектировала и не выполняла этот объект. C# 4.0 и класс ExpandoObject просто происходят как с последней версией .NET.
Чтобы ответить на ваш вопрос, я отсылаю вас к documentation для ExpandoObject, в котором четко говорится:
ExpandoObject класс является реализацией динамической концепции объекта, что позволяет получать, настройку и ссылающийся член. Если вы хотите определить типы, которые имеют собственную семантику динамической отправки, используйте класс DynamicObject.
Как указано в документации, если вы хотите использовать специальную семантику отправки над простым вызовом элементов, то используйте класс DynamicObject.
Если нет, то почему бы и нет? это было по дизайну?
Кому-то может понадобиться объект expando, но этот человек может не хотеть и не нуждается в наследовании прототипа. Объекты Expando логически не требуют какой-либо формы наследования.
как это можно реализовать?
Используйте объект DynamicObject. Напишите свой собственный механизм наследования прототипов.
Если да, то как это работает и существуют различия в том, как это работает в Javascript?
Если вы пытаетесь написать свое собственное наследование прототип, который так же, как JScript-х, я призываю вас чрезвычайно внимательно прочитайте спецификацию ECMAScript. Наследование прототипов выглядит просто, но есть тонкости, которые большинство людей ошибаются. Например, даже эксперты JScript часто получают эту маленькую загадку неправильно. Что делает этот код JScript?
var Animal = new Object();
function Reptile() { }
Reptile.prototype = Animal;
var lizard = new Reptile();
print(lizard instanceof Reptile); // this is true
print(lizard.constructor == Reptile); // is this true or false? explain your answer!
Наследование прототипов не всегда срабатывает так, как вы думаете! Для объяснения того, что это печатает и почему, см. my article on the subject.
Интересный вопрос. Я полагаю, что самая большая проблема, о которой я могу думать, - это методы экземпляра - если у вас есть, как вы можете ссылаться на это? Мелко-копирование всех свойств должно быть достаточно простым, но я думаю, что ваш вопрос шире. Зачем вам это нужно, между прочим? Академический интерес? – Kobi
Общий интерес, более чем академический ... Увидев новую ориентацию C# на динамическую типизацию в своей версии 4.0, вопрос встал на мой взгляд относительно того, насколько они это восприняли. Наследование на основе прототипа, в конце концов, является признаком некоторых языков с динамически типизированным языком. – luvieere