Recientemente escribí una biblioteca de clases que incluye algunos objetos que modelan ciertos tipos de archivos. Por ejemplo, no es una clase abstracta Document
, con las clases derivadas PdfDocument
(hormigón) y OfficeDocument
(abstracto, con clases concretas derivadas tales como WordDocument
y ExcelDocument
), etc.¿Quién debería ser responsable de seleccionar la clase derivada apropiada?
actualmente la forma clientes crear un nuevo objeto es mediante la selección de la clase derivada apropiada y pasándola la matriz de bytes. Así, por ejemplo, si tengo una matriz de bytes de un PdfDocument y una WordDocument, me gustaría hacer algo como:
var wordDocument = new WordDocument(wordDocumentByteArray);
var pdfDocument = new PdfDocument(pdfDocumentByteArray);
Es este diseño aceptable, que el cliente debe saber qué clase deriva de usar? ¿O sería mejor ocultar todas las clases salvo la abstracta Document
y usar algo como un patrón abstracto de fábrica para devolver el tipo derivado correcto? ej .:
var wordDocument = DocumentFactory.GetDocument(wordDocumentByteArray, "docx");
// pass file extension so we know what the file is
Tenga en cuenta que los tipos derivados no añadir propiedades/métodos adicionales para la clase abstracta, que acaba de poner en práctica los métodos abstractos de diferentes maneras.
Definitivamente la 2da opción. Permite una extensibilidad mucho más fácil en el futuro y significa que las personas pierden menos tiempo actualizando las declaraciones de clase cuando se agregan tipos nuevos y más apropiados. –
¿La clase 'Document' tiene todo lo que el usuario final tendrá que hacer con un' Documento' determinado, o de vez en cuando (o con frecuencia) necesitará acceso a la funcionalidad que es específica para un tipo más derivado? – Servy
@Servy Sí, la clase 'Document' tiene un método de resumen público. Todas las clases derivadas consisten solo en métodos de ayuda protegidos y privados (más el método público anulado) con el único propósito de implementar el único método público. – Andrew