Поддерживает ли С# 4.0 ExpandoObject основанное на прототипе наследование?

Есть ли С# 4.0 ExpandoObject поддержка Наследование на основе прототипа? Если нет, то почему (по дизайну?) И как это можно реализовать? Если да, то как это работает и какие различия существуют по сравнению с тем, как он работает в Javascript?

Ответы

Ответ 1

Поддерживает ли С# 4.0 ExpandoObject основанное на прототипе наследование?

Прежде всего, обратите внимание, что класс ExpandoObject не имеет ничего общего с С# 4.0. Команда С# не проектировала и не выполняла этот объект. С# 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!

Наследование прототипа не всегда работает так, как вы думаете, что он делает! Для объяснения того, что это печатает и почему, см. мою статью по теме.