¿Debo sellar todas las clases que sé que nunca deberían usarse como una clase base, incluso cuando no hay problemas tangibles de rendimiento o seguridad, o es solo agregar cruft?¿Debo sellar todas las clases que sé que nunca deberían usarse como una clase base?
Respuesta
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.
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
Compraré esto. ¿Crees que las clases de C# deberían estar selladas por defecto? –
@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. –
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.
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.)
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
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.
- 1. Sellar una clase
- 2. ¿Debo declarar todas las funciones virtuales en una clase base?
- 3. ¿Por qué sellar una clase?
- 4. ¿Debo implementar IDisposable en todas las clases, o es una clase base suficiente?
- 5. Hibernate EntityManager, ¿se supone que debe usarse como singleton?
- 6. Eliminar todas las clases que comienzan con una cierta cadena
- 7. ¿Cómo encontrar todas las clases que implementan una interfaz determinada?
- 8. Cómo sellar una propiedad anulado
- 9. Cómo codificar un conjunto de clases enum que todas deberían soportar un método público estático
- 10. Registre una clase C++ para que luego una función pueda iterar sobre todas las clases registradas
- 11. En tiempo de ejecución, se encuentran todas las clases en una aplicación Java que se extienden una clase base
- 12. ¿Cuándo deberían usarse los archivos XSD?
- 13. ¿Cómo encontrar todas las clases que implementan IDisposable?
- 14. Haciendo que la configuración esté disponible para todas las clases
- 15. Enumerar todas las clases que heredan de una clase/interfaz específica
- 16. Obtener todas las clases heredadas de una clase abstracta
- 17. ¿Cómo deberían usarse las excepciones en C++ moderno?
- 18. ¿Cómo puedo obtener todas las clases heredadas de una clase base?
- 19. TypeID para las clases derivadas de una clase base común
- 20. Prueba de todas las clases que implementan una interfaz en Java
- 21. Eclipse: encuentre todas las clases que extienden la interfaz
- 22. ¿Listar todas las clases base en una jerarquía de clase dada?
- 23. ¿Deberían todas las pruebas unitarias ser exitosas?
- 24. ¿Deberían usarse `! Var` o` var == NULL`?
- 25. ¿Es correcto definir todas las clases como casos en Scala para que todos sus argumentos tengan propiedades automáticamente?
- 26. ¿Cómo puedo hacer un seguimiento de (enumerar) todas las clases que implementan una interfaz?
- 27. La herencia de una clase base que implementa INotifyPropertyChanged
- 28. ¿Cómo decirle a ASP.Net MVC que todas las fechas entrantes deserializadas de JSon deberían ser UTC?
- 29. Si la clase Base está marcada Serializable ¿están todas las clases secundarias marcadas también?
- 30. Principio de Responsabilidad Individual: ¿todos los métodos públicos en una clase tienen que usar todas las dependencias de clase?
[Somone dijo, y leí:] (http://programmers.stackexchange.com/a/210481/4261) no * nunca * sella una clase a menos que * sepa * tendrá problemas de soporte con tus clientes – cregox