Ho recentemente scritto una libreria di classi che include alcuni oggetti che modellano determinati tipi di file. Ad esempio, v'è un estratto Document
di classe, con le classi derivate PdfDocument
(cemento) e OfficeDocument
(astratto, con classi concrete derivate come WordDocument
e ExcelDocument
), eccChi dovrebbe essere responsabile della selezione della classe derivata appropriata?
attualmente il modo i clienti a creare un nuovo oggetto è selezionando la classe derivata appropriata e passandogli la matrice di byte. Così, per esempio, se ho un array di byte di un PdfDocument e un WordDocument, vorrei fare qualcosa di simile:
var wordDocument = new WordDocument(wordDocumentByteArray);
var pdfDocument = new PdfDocument(pdfDocumentByteArray);
È questo disegno accettabili, che il cliente deve sapere cosa classe derivata da usare? O sarebbe meglio nascondere tutti tranne la classe astratta Document
e utilizzare qualcosa come un modello di fabbrica astratto per restituire il tipo corretto derivato? es .:
var wordDocument = DocumentFactory.GetDocument(wordDocumentByteArray, "docx");
// pass file extension so we know what the file is
Nota che i tipi di derivati non aggiungono ulteriori proprietà/metodi per la classe astratta, hanno appena implementare i metodi astratti in modi diversi.
Sicuramente la seconda opzione. Consente un'estensibilità futura molto più semplice e significa che le persone impiegano meno tempo ad aggiornare le dichiarazioni di classe quando vengono aggiunti nuovi tipi più appropriati. –
La classe 'Document' ha tutto ciò che l'utente finale avrà mai bisogno di fare con un dato' Documento', o avrà a volte (o frequentemente) bisogno di accedere a funzionalità specifiche per un tipo più derivato? – Servy
@Servy Sì, la classe 'Document' ha un metodo astratto pubblico. Tutte le classi derivate consistono solo di metodi di supporto protetti e privati (oltre al metodo pubblico sottoposto a override) con l'unico scopo di implementare l'unico metodo pubblico. – Andrew