Estendi l'API o utilizza lo stesso nome di una classe nell'API?

1

Mi sono imbattuto sempre più in questo problema: non sono soddisfatto dell'API corrente e finisco per creare una mia classe che faccia ciò che desidero abbia fatto l'API; tuttavia, non estendo la "super classe" in quanto non la sento pienamente adatta. Non riesco a immaginare che questa sia una buona pratica, quindi dovrei semplicemente estendere la 'super classe' o dovrei nominare la classe leggermente diversa da quella che ritengo dovrebbe essere la classe originale?

Ad esempio , in Java finisci per scrivere dieci righe di codice solo per leggere un file in una lista, ogni voce è uno dei file.

Quindi di nuovo, in casi come questo, se la classe dovesse essere rinominata in qualcosa di simile, o dovrebbe andare avanti e semplicemente estendere la classe includi il comportamento che volevi? Sembra quasi sbagliato per me estendere le classi API, ma allo stesso tempo, non facendolo, stai sconfiggendo il punto di ereditarietà in OOP.

    
posta TomJ 23.04.2012 - 04:42
fonte

2 risposte

3

Non dovresti ereditare da File o qualsiasi altra classe per aggiungere funzionalità aggiuntive ad esso. La tua nuova classe non è un file, ma piuttosto un insieme di metodi di utilità per il file di classe. In altre parole, non ci sarebbero metodi che potresti passare in NewSuperFile in modo che il metodo si comporti diversamente.

In C # puoi creare Metodi di estensione . Quindi in questo caso non è necessario ereditare da una classe per aggiungere metodi aggiuntivi, sintatticamente.

In Java il paradigma tipico è creare una classe ClassUtils. In questo caso dovresti creare un IOUtils o FileUtils.

public class FileUtils {         
    /**
     * Read the file one line at a time, and return an array of lines
     * @return List<String>
     */
    public static List<String> readFile(File file) throws IOException {     
            List<String> lines = new ArrayList<>();
            try (InputStream in = Files.newInputStream(file);
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(in))) {
            String line;
            while ((line = reader.readLine()) != null) {
                lines.add(line);
            }
        } 
        return lines;
    }   
}
    
risposta data 23.04.2012 - 07:37
fonte
0

Vorrei aggiungere i tuoi nuovi metodi helper alla superclasse solo se

altrimenti creerei una nuova classe.

    
risposta data 23.04.2012 - 10:30
fonte

Leggi altre domande sui tag