2008-10-31 15 views
28

Me preguntaba, ya que el sellada existencia de palabra clave indica que se trata de la decisión del autor de clase en cuanto a si otras clases se les permite heredar de él, ¿por qué no son clases cerradas por defecto, con una cierta palabra clave para marcarlos de forma explícita como ¿extensible?¿Por qué las clases no están selladas por defecto?

sé que es algo diferente, pero modificadores de acceso funciona de esta manera. Con el valor predeterminado, el acceso más restrictivo y completo solo se otorga con la inserción de una palabra clave.

Hay una gran posibilidad de que no he pensado en esto correctamente, sin embargo, por favor humana!

+4

Argumentaría que, si las clases se cerraron por defecto, entonces eso significa que NO se debe utilizar un lenguaje orientado a objetos. –

+0

Demasiadas veces me he encontrado con clases selladas dentro de .NET Framework que quería heredar y anular la funcionalidad. Lo mismo ocurre con las internas. –

+0

un lenguaje con objetos y mensajes pero no herencia no está orientado a objetos, sino simplemente basado en objetos –

Respuesta

28

En mi opinión no debería haber sintaxis predeterminada, de esa manera siempre se escribe explícitamente lo que se desea. Esto obliga al codificador a comprender/pensar más.

Si desea que una clase sea heredable a continuación, se escribe

public extensible class MyClass 

lo contrario

public sealed class MyClass 

Por cierto, creo que el mismo debería ir con modificadores de acceso, no permitir modificadores de acceso por defecto.

+0

Buen punto, siempre tendrías que ser claro sobre lo que estabas haciendo en lugar de a sabiendas o inconscientemente recurrir a los valores predeterminados invisibles. – xyz

+0

podría considerar el uso del modificador abstracto para ser usado con el propósito de heredar – Spoike

+3

Reutilizaría la palabra clave 'base' existente" clase base pública ... " –

16

Veo dos razones simples:

  1. La herencia es un principio fundamental de la OO, por lo que no permitir que por defecto no sería intuitivo.
  2. La mayoría de las clases están diseñadas para permitir la herencia, por lo que al permitir la herencia de forma predeterminada, se ahorra tipeo.
+27

Creo que muchos argumentarían que la mayoría de las clases * no * están diseñadas para ser heredadas de. –

+11

También argumento que la mayoría de los desarrolladores no construyen sus clases con herencia en mente. –

+2

Mike y Steve, si sigues buenas prácticas de OO, diseñarás clases para que sean heredadas y reutilizadas. –

3

sellados clases impiden la herencia y por lo tanto son una abombination OO. ver this rant para más detalles ;-)

+1

gracias por el downvotes drive-by sin comentarios - ¡cobardes!:-P –

+3

Personalmente, creo que la herencia de implementación es demasiado exagerada en importancia. Y, en general, estoy de acuerdo con la afirmación de que el valor predeterminado debe estar sellado: es extremadamente fácil arruinar la herencia. Por lo general, se debe usar la composición cuando sea posible. Entonces, estoy totalmente en desacuerdo :) Para mí, las principales ventajas del desarrollo de OO son las interfaces y el polimorfismo. – Phil

+1

@ [Phil]: entonces, cada vez que creas un formulario de Windows, ¿encapsulas un objeto Form en lugar de heredarlo de System.Windows.Form? Parece mucho trabajo extra ... La herencia es fundamental; aprenderlo, vivirlo, amarlo ;-) –

4

Probablemente se podría hacer al igual que muchos argumentos a favor de sellado por defecto como lo haría en contra de ella. Si fuera al revés, alguien estaría publicando la pregunta opuesta.

3

deriva simplemente de una clase sin sellar no cambia el comportamiento de la clase. Lo peor que puede pasar es que una nueva versión de la clase base agregue un miembro con el mismo nombre que la clase derivada (en cuyo caso solo habrá una advertencia del compilador que diga que debe usar new o override modifier) o la clase base está sellada (que es un diseño no-no si la clase ya ha sido lanzada al aire libre). La clasificación secundaria arbitraria aún cumple con el Liskov Substitution Principle.

La razón por la cual los miembros no son anulables por defecto en C# es porque anular un método puede cambiar el comportamiento de la clase base de una manera que el autor de la clase base no anticipó. Haciéndolo explícitamente abstracto o virtual, está diciendo que el autor es consciente de que puede cambiar o está fuera de su control y el autor debería haber tenido esto en cuenta.

39

yo diría que fue un error. Conozco a muchas personas (incluyéndome a mí) que creen que las clases deberían estar selladas por defecto. Hay al menos un par de personas en el equipo de diseño de C# en ese campamento. El péndulo se ha alejado ligeramente de la herencia desde que se diseñó C# por primera vez. (Tiene su lugar, por supuesto, pero me encuentro usándolo relativamente poco).

Por lo que sea, ese no es el único error en la línea de estar demasiado cerca de Java: personalmente preferiría Igual y GetHashCode no estaba en el objeto, y que también necesitaba instancias de Monitor específicas para el bloqueo ...

+0

¿Quiénes en el equipo de C# fueron pro-sellados? –

+0

Eric Lippert, y Cyrus también, creo. (No creo que ninguno de ellos estuviera en el equipo para v1). –

+1

Si GetHashCode no estuviera en el objeto, a cada agregador (ni siquiera al heredero) se le debería dar acceso a las partes privadas de cada tipo, y los agregadores tendría que hacer rodar su propio hasher para cada tipo. ¿Realmente crees que eso disminuiría la cantidad de dolor en la programación? –

2

80% de las características de Word no se utilizan. 80% de las clases no se heredan de. En ambos casos, de vez en cuando, alguien viene y quiere usar o reutilizar una característica. ¿Por qué debería el diseñador original prohibir la reutilización? Permita que el reusuario decida qué quiere reutilizar.

+2

Ese es un argumento en contra de la existencia de la palabra clave sellada, no la predeterminada :) – xyz

0

Por la misma razón por la cual los objetos no son privados por defecto

o

para ser coherente con el análogo objeto, que es objetos no son privados por defecto

sólo una suposición, coz en el al final del día, es la decisión de diseño de un idioma y lo que los creadores dicen es el material del canon.

+2

Ese era el punto de Frou. Los miembros NO son públicos por defecto. –

Cuestiones relacionadas