Поддерживает ли ExpandoObject в C # 4.0 прототипное наследование? - PullRequest
13 голосов
/ 31 мая 2010

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

1 Ответ

21 голосов
/ 31 мая 2010

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

Прежде всего, обратите внимание, что класс ExpandoObject не имеет ничего общего с C # 4.0. Команда C # не проектировала и не реализовала этот объект. C # 4.0 и класс ExpandoObject просто поставляются с последней версией .NET.

Чтобы ответить на ваш вопрос, я отсылаю вас к документации для ExpandoObject, в которой четко указано:

Класс ExpandoObject является реализацией концепции динамического объекта, которая позволяет получать, устанавливать и вызывать члены. Если вы хотите определить типы, которые имеют собственную семантику динамической отправки, используйте класс DynamicObject.

Как указано в документации, если вы хотите, чтобы пользовательская семантика отправки была выше простого вызова членов, используйте класс DynamicObject.

Если нет, то почему бы и нет? это было задумано?

Кто-то может захотеть объект расширения, но этот человек может не хотеть и не нуждаться в наследовании прототипа. Объекты 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!

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

...