C# 4.0's ExpandoObject поддерживают Основанное на прототипе наследование? В противном случае, почему не (было это дизайном?) и как это могло быть реализовано? Если да, как это работает и что различия там по сравнению со способом, которым это работает в JavaScript?
Поддерживает ли ExpandoObject C # 4.0 наследование на основе прототипов?
Прежде всего, обратите внимание, что класс ExpandoObject не имеет никакого отношения к C # 4.0. Команда C # не проектировала и не реализовывала этот объект. C # 4.0 и класс ExpandoObject просто поставляются с последней версией .NET.
Чтобы ответить на ваш вопрос, я отсылаю вас к документации для 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!
Наследование прототипа не всегда работает так, как вы думаете! Объяснение того, что это печатает и почему, можно найти в моей статье на эту тему .