2011-04-15 14 views

Respuesta

16

Porque specification lo dice en la sección §17.1.2.

+2

1, también en Java primero tiene que escribir 'extends' y luego' implements'. Es más lógico y tal vez en otros idiomas (aparte de C# y Java) es lo mismo. –

+1

Por favor, incluya las partes relevantes de la especificación en su respuesta. El segundo enlace me parece roto. – Alexei

3

Se llama sintaxis

Hay convenciones que debe seguir para que el compilador para compilar el código.

Podrían haber elegido permitir ambas formas, o al revés, pero no lo hicieron. Probablemente la razón sea clara: puede definir muchas interfaces y solo heredar de una clase.

Técnicamente hubiera sido posible permitirlos todos en orden aleatorio, pero eso haría que el código fuera menos legible.

2

Simplemente porque el lenguaje está diseñado así. La razón probablemente sea que una clase solo puede tener una clase base, pero puede implementar cualquier cantidad de interfaces.

2

Dado que puede extender una sola clase e implementar más de una interfaz, tener la clase primero hace que sea más fácil de leer. Y, probablemente, la gramática en sí es más facil de escribir de esa manera, sólo un seudo gramática podría ser:

class CLASSNAME:baseclass? interface* 

significa baseclass opcional seguido por muchos interfaz, escribir una gramática que permita que una sola clase en mal estado en algún lugar sería difícil sin ninguna razón .

+0

Estoy de acuerdo, hace que la gramática sea mucho más fácil de especificar. –

8

C# sólo admite única herencia, pero permite que las clases que implementan múltiples interfaces. Siendo ese el caso, es mucho más claro tener siempre la clase base especificada en el mismo lugar por convención, en lugar de mezclarse con un grupo de interfaces.

Independientemente de la convención, the specification mandates that this is the case de todos modos, es por eso que está viendo ese error.

Recuerde, no hay nada en la especificación que indique que todas sus interfaces deben nombrarse con una "I" mayúscula. - eso es solo una convención. Entonces, si su clase implementó interfaces que no siguieron esa convención, y si la especificación le permitiera especificar la clase base y las interfaces en cualquier orden, no sería fácil identificar qué identificador era la clase base y cuáles eran las interfaces. . Ejemplo:

class MyDerivedClass : A, B, C, D, E // which is the base class? 
{ 
... 
} 
1

Sólo se puede heredar de una clase base, pero muchos interfaces. Entonces, si hay más de un tipo en la lista, sabrá que el primero es una clase, las otras interfaces.Esto funciona independientemente de las convenciones de nombres de clase/interfaz

1

El orden tiene sentido claro, la clase base se puede poner en práctica los miembros de la interfaz para la clase derivada, por lo tanto, el compilador debe conocer de antemano

+0

@Mogsdad bien, simplemente lo dejo como una respuesta, entonces ... –

+0

Claramente lo hace y mejor que cualquier respuesta anterior simplemente diciendo "Porque eso es lo que dijeron" –

Cuestiones relacionadas