2010-01-29 12 views

Respuesta

44

Una clase que es extensible implementa la característica de que se puede extender; esa es una función como cualquier otra característica de la clase, y debe tratarse como una, no diferente de un método. Todas las características deben pensarse detenidamente para garantizar que cumplan los objetivos del cliente que utiliza la función. Las características deben ser diseñadas, implementadas, revisadas por problemas de seguridad, depuradas, documentadas y mantenidas.

Todo lo que cuesta esfuerzo y esfuerzo generalmente requiere el desembolso de dinero. ¿De quién es el dinero que está gastando? Podrían tener una opinión sobre si deberías hacer esta función o no.

Básicamente, usted tiene tres opciones:

1) gastar el dinero para hacer la función para que tenga la confianza de que es correcto, robusto, seguro y cumple con las necesidades del usuario.

2) Haz ninguna de las anteriores, pero su entrega la característica de todos modos y la esperanza de que el envío de una aplicación rápida indocumentado función no diseñado, no probado, sin mantenimiento, con riesgos de seguridad desconocidas no le daña, su empleador o sus clientes.

3) Selle la clase. Desbloquee más tarde si encuentra que (1) fue la elección correcta.

Digo que (3) tiene una buena relación calidad-precio. Siempre cierro todas las clases que escribo que no fueron diseñadas para extensibilidad.

+4

Eric, he aquí una pregunta para usted.Al igual que la forma en que debe declarar un método "virtual" antes de que pueda anularlo, ¿por qué C# no adoptó algo similar para indicar que una clase se puede heredar y sellar por defecto? Sólo curioso. – SolutionYogi

+0

Compraré esto. ¿Crees que las clases de C# deberían estar selladas por defecto? –

+14

@Daniel, @SolutionYogi: Ojalá lo hubiéramos hecho. Sin embargo, en realidad estoy en minoría; hay muchas personas que creen que solo debes cerrar las clases cuando tienes una razón para hacerlo. Estoy en desacuerdo; Creo que solo deberías desbloquear las clases cuando tengas una razón para hacerlo. –

5

Sí. Si nada más, es un letrero que les informa a los demás que no deben ir más lejos en el camino.

10

Establecer una clase para que sea sealed no es simple ya que al hacerlo establece una regla estricta en su código: Esta clase no se puede heredar.

El código es único si no es necesario y confuso.

Dicho esto, una escuela de pensamiento (y regla general) es que siempre debe sellar todas las clases, ya que es fácil destrabarlas si es necesario, pero no al revés. Algunos generadores de código hacen esto automáticamente. (Ver la opción # 3 de Eric Lippert. Básicamente dice lo mismo.)

+1

Como casi todas las respuestas sobre cómo hacer cosas, depende. Hay algunas optimizaciones que se pueden obtener sellando las clases por defecto y solo desbloqueándolas cuando sea necesario. Tome un vistazo a: http://msdn.microsoft.com/en-us/library/ms998547.aspx http://dotnetperls.com/sealed-1 – Firestrand

7

No lo consideraría como agregar cruft. En cambio, estás expresando claramente tus intenciones para la clase.

Las clases deben diseñarse para herencia o sellarse. Desafortunadamente, las clases no están selladas por defecto en C# por lo que debe incluir la palabra clave usted mismo. Personalmente, hubiera preferido una palabra clave para hacer explícitamente que las clases estén disponibles para la herencia, ya que eso evitaría que las personas usen una clase como clase base a menos que se haya marcado explícitamente como tal.

Cuestiones relacionadas