C# 4.0's ExpandoObject поддерживают Основанное на прототипе наследование?

C# 4.0's ExpandoObject поддерживают Основанное на прототипе наследование? В противном случае, почему не (было это дизайном?) и как это могло быть реализовано? Если да, как это работает и что различия там по сравнению со способом, которым это работает в JavaScript?

13
задан Jim Aho 2 April 2014 в 17:42
поделиться

1 ответ

Поддерживает ли 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!

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

21
ответ дан 1 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: