2011-09-20 15 views
10

En varios lugares (por ejemplo, "Creating Windows Runtime Components for JavaScript, in C# and Visual Basic" en MSDN), lo he visto especificar que, si escribe una clase en .NET que desea usar desde JavaScript, debe convertirla en una clase sellada.¿Por qué los tipos WinRT deben sellarse?

Esto parece una restricción arbitraria. ¿Por qué JavaScript solo funciona con clases selladas?

+6

Porque WinRT se basa en COM y COM no admite herencia. La palabra clave * sealed * garantiza que es claro para cualquiera que vea el código que dicha clase no es extensible a través de la herencia. –

+1

@Hans En realidad, hay alguna forma de herencia admitida por WinRT, p. Ej. puede heredar de 'FrameworkElement' (que es una clase WinRT) en .NET. Y no tiene que marcar las clases definidas en C++/CX como selladas, y puede heredarlas también. Así que esto parece ser una limitación solo para autorizar componentes WinRT en .NET, no una limitación (heredada por COM) de WinRT. –

+4

@Hans: COM admite herencia. Sin embargo, no permitimos la herencia de la interfaz en las interfaces winrt. –

Respuesta

7

Los objetos de tiempo de ejecución de Windows expuestos a aplicaciones de JavaScript están sellados desde una perspectiva de JavaScript; no puede agregar propiedades de expansión a los objetos de WinRT. Pero desde C++ y C#, los objetos winrt se pueden heredar si el objeto admite herencia (la mayoría de las clases Xaml admiten herencia, por ejemplo, pero la mayoría de las demás no). El motivo por el que los objetos WinRT están sellados de JS es asegurar que el objeto winrt se comporte igual independientemente de lo que haya hecho la aplicación: si una aplicación redefine alguna propiedad de función en un objeto, podría causar otras partes de la aplicación. comportarse mal.

+0

La misma restricción en C#, verifique a las 40:15 en este video: http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-531T COM no admite la herencia de implementación. –

+2

@Hans: Esto no tiene absolutamente nada que ver con COM. El tiempo de ejecución de Windows es * no * COM (tiene algunos elementos de COM, pero es * muy * diferente). El tiempo de ejecución es compatible con la herencia, como se mencionó anteriormente en Pavel, puede derivarse de FrameWorkElement en C++/CX o C#/VB. –

+2

No puedo evitar hacer la prueba "deriva de IUnknown, does reference beunting: it is a duck". Estoy deseando que escribas sobre esto. –

Cuestiones relacionadas