2010-05-31 12 views
13

¿Tiene C# 4.0 ExpandoObject compatible con Prototype-based inheritance? Si no, ¿por qué no (fue por diseño?) Y ¿cómo podría implementarse? En caso afirmativo, ¿cómo funciona y qué diferencias existen en comparación con la forma en que funciona en Javascript?¿ExpandoObject de C# 4.0 admite la herencia basada en prototipos?

+0

Interesante pregunta. Supongo que el mayor problema que puedo pensar es en los métodos de instancia. Si tiene alguno, ¿cómo puede hacer referencia a 'this'? Someras-Copiar todas las propiedades debería ser lo suficientemente fácil, pero creo que su pregunta es más amplia que eso. ¿Por qué necesitarías esto, por cierto? ¿Interés académico? – Kobi

+0

Interés general, más que académico ... Al ver la orientación recién descubierta de C# hacia el tipado dinámico en su versión 4.0, la pregunta surgió en mi mente en cuanto a qué tan lejos tomaron esto. La herencia basada en el prototipo es, después de todo, una característica de algunos lenguajes de tipo dinámico. – luvieere

Respuesta

20

¿El ExpandoObject de C# 4.0 admite la herencia basada en prototipos?

En primer lugar, tenga en cuenta que la clase ExpandoObject no tiene nada que ver con C# 4.0. El equipo de C# no diseñó ni implementó este objeto. C# 4.0 y la clase ExpandoObject simplemente llegan a ambos con la última versión de .NET.

Para responder a su pregunta le remito a la documentation para ExpandoObject, que establece claramente:

clase El ExpandoObject es una implementación del concepto de objeto dinámico que permite conseguir, el escenario y la invocación de los miembros. Si desea definir tipos que tengan su propia semántica de despacho dinámico, use la clase DynamicObject.

Como dice la documentación, si desea una semántica de despacho personalizado por encima de la mera invocación de miembros, utilice la clase DynamicObject.

Si no, ¿por qué no? ¿fue por diseño?

Alguien podría querer un objeto de expansión, pero esa persona podría no querer ni necesitar una herencia de prototipo. Los objetos Expando no requieren lógicamente ninguna forma de herencia.

¿cómo podría implementarse esto?

Utilice el objeto DynamicObject. Escribe tu propio mecanismo de herencia prototipo.

En caso afirmativo, ¿cómo funciona y las diferencias existen en la forma en que funciona en Javascript?

Si está intentando escribir su propia herencia de prototipo que es exactamente igual que JScript de, os animo a leer la especificación ECMAScript muy cuidadosamente. La herencia del prototipo parece simple, pero hay sutilezas que la mayoría de las personas se equivocan. Por ejemplo, incluso los expertos de JScript suelen equivocarse con este pequeño acertijo. ¿Qué imprime este código 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! 

¡La herencia de prototipos no siempre funciona de la manera que usted cree! Para una explicación de lo que esto imprime y por qué, vea my article on the subject.

Cuestiones relacionadas