Domanda

È buona norma lasciare che le classi astratte definiscano le variabili di istanza?

public abstract class ExternalScript extends Script {

    String source;

    public abstract void setSource(String file);

    public abstract String getSource();
}

La sottoclasse, ExternalJavaScript.class, otterrebbe quindi automaticamente la variabile sorgente, ma ritengo che sia più semplice leggere il codice se tutte le sottoclassi stesse definiscono la fonte, anziché dall'ereditarietà.

Qual è il tuo consiglio?

/ Adam

È stato utile?

Soluzione

Avrei pensato che qualcosa del genere sarebbe molto meglio, dato che stai aggiungendo una variabile, quindi perché non limitare l'accesso e renderlo più pulito? I tuoi getter / setter dovrebbero fare ciò che dicono sulla scatola.

public abstract class ExternalScript extends Script {

private String source;

public void setSource(String file) {
    source = file;
}

public String getSource() {
    return source;
}

Riportando questo alla domanda, ti preoccupi mai di vedere dove si trova il codice getter / setter quando lo leggi? Se tutti ottengono e ottengono impostazioni, non è necessario preoccuparsi di ciò che la funzione "fa" durante la lettura del codice. Ci sono anche alcuni altri motivi a cui pensare:

  • Se l'origine era protetta (così accessibile da sottoclassi) il codice diventa disordinato: chi sta cambiando le variabili? Quando è un oggetto, diventa difficile quando è necessario eseguire il refactoring, mentre un metodo tende a semplificare questo passaggio.
  • Se i tuoi metodi getter / setter non stanno ottenendo e impostando, descrivili come qualcos'altro.

Pensa sempre se la tua classe è davvero una cosa diversa o no, e questo dovrebbe aiutarti a decidere se hai bisogno di qualcosa di più.

Altri suggerimenti

Sicuro .. Perché no?
Le classi di base astratte sono solo una comodità per ospitare comportamenti e dati comuni a 2 o più classi in un unico posto per l'efficienza di conservazione e manutenzione. È un dettaglio di implementazione.
Fai attenzione, tuttavia, che non stai utilizzando una classe base astratta in cui dovresti utilizzare un'interfaccia. Fare riferimento a Classe interfaccia vs base

Certo. L'idea generale delle classi astratte è che possono contenere alcuni comportamenti o dati che tutte le sottoclassi devono contenere. Pensa al semplice esempio di WheeledVehicle: dovrebbe avere una variabile membro numWheels. Volete che tutte le sottoclassi abbiano questa variabile. Ricorda che le classi astratte sono una funzionalità molto utile durante lo sviluppo di API, in quanto possono garantire che le persone che estendono l'API non la interrompano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top