2012-03-02 10 views

Respuesta

12

Las estructuras ocupan ranuras de tamaño fijo en la pila (o donde sea que estén).

Por lo tanto, no sería capaz de hacer ningún tipo de polimorfismo con estructuras, ya que la estructura derivada sería de un tamaño diferente.

Sería posible heredar miembros de otras estructuras, pero ya que no sería capaz de hacer ningún tipo de polimorfismo, no valdría la pena la confusión.

+4

Eso no excluye una sintaxis de plantillas, sin embargo, que cuando heredó de una estructura, obtuvo una copia de todos los métodos, propiedades y campos de la misma. No sería compatible con la asignación, pero tendría el mismo diseño además de cualquier elemento adicional que haya agregado en el "descendiente". Supongo que ese hecho es suficiente, sería confuso. –

+4

Dos palabras: corte de objetos. http://en.wikipedia.org/wiki/Object_slicing –

+2

@ LasseV.Karlsen: Exactamente. Si esto hubiera sido posible, esta pregunta habría sido "¿Por qué no puedo escribir' Base b = new Derived() '?" – SLaks

1

En .NET, si la clase A hereda de tipo B y un objeto de tipo A se pasa al código que espera un objeto de tipo B, el objeto pasado no sería convertido a un B pero seguiría siendo un A. Esto es posible porque cada objeto ha almacenado una referencia a un descriptor de tipo. Las clases no tienen ningún tipo de descriptores almacenados con ellos. Si una estructura del tipo A se pudiera pasar por valor a una rutina que esperara una estructura del tipo B, sería convertida en una estructura del tipo B. En los casos donde sería sensato, sería más práctico definir un operador de conversión de ampliación del tipo A a B.

Hay ocasiones en que puede ser útil pasar una estructura del tipo A por referencia a una rutina que espera tipo B. Los operadores de conversión no ayudarían allí. Sin embargo, esto podría manejarse, aunque de forma un tanto incómoda, al tener el tipo de estructura A que no contenga nada más que un campo de tipo B. Ese campo podría pasarse por referencia a la rutina que espera tipo B; la dificultad sería que uno debería incluir el nombre de la estructura interna en cualquier campo de acceso.

Lo que sería útil, no solo para las estructuras sino también para las clases, sería el concepto de un 'tipo de extensión'. Todas las clases, ya sean heredables o no, podrían extenderse con un tipo de extensión, que incluiría solo miembros de la instancia; las variables o valores de un tipo de extensión se considerarían objetos de tiempo de ejecución del tipo base, y todas las conversiones entre tipos de extensión y sus tipos base, o entre tipos de extensiones derivadas del mismo tipo base se considerarían 'ampliadas' y serían procesado como no-operaciones El único efecto de un tipo de extensión sería traer miembros de ámbito definidos para ese tipo. Estos se comportarían de forma similar a los métodos de extensión, excepto que solo se aplicarían a variables y variables declaradas como tipo de extensión, y los miembros de los tipos de extensión tendrían prioridad sobre los miembros de la clase base. Uno puede imaginar muchos usos para tales cosas (en los casos en que uno quisiera usar métodos de extensión en algunas instancias de una clase, pero puede que no quiera que estén disponibles en todas las instancias), pero todavía no tengo conocimiento de ningún tipo de soporte compatible. característica.

Cuestiones relacionadas