Java - classe abstraite pour contenir des variables?

Est-ce une bonne pratique de laisser les classes abstraites définir des variables d'instance?

public abstract class ExternalScript extends Script {

    String source;

    public abstract void setSource(String file);

    public abstract String getSource();
}

La sous-classe, ExternalJavaScript.class, obtiendrait alors automatiquement la variable source, mais je pense qu'il est plus facile de lire le code si toutes les sous-classes définissent elles-mêmes la source, au lieu de l'héritage.

Quel Est votre conseil?

/Adam

21
demandé sur John Topley 2008-10-25 14:37:35

3 réponses

J'aurais pensé que quelque chose comme ça serait beaucoup mieux, puisque vous ajoutez une variable, alors pourquoi ne pas restreindre l'accès et le rendre plus propre? Votre lecture/définition devrait faire ce qu'ils disent sur la boite.

public abstract class ExternalScript extends Script {

private String source;

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

public String getSource() {
    return source;
}

Ramenant cela à la question, Avez-vous déjà pris la peine de regarder où se trouve le code getter/setter en le lisant? Si tous obtiennent et définissent, vous n'avez pas besoin de vous soucier de ce que la fonction "fait" lors de la lecture du code. Il ya quelques autres raisons pour pensez aussi:

  • Si la source était protégée (si accessible par les sous-classes), le code devient désordonné: qui change les variables? Quand c'est un objet, cela devient difficile lorsque vous avez besoin de refactoriser, alors qu'une méthode a tendance à faciliter cette étape.
  • Si vos méthodes getter / setter ne sont pas getting and setting, décrivez-les comme autre chose.

Pensez toujours si votre classe est vraiment différente ou non, et cela devrait aider à décider si vous avez besoin rien de plus.

30
répondu Egwor 2008-10-25 10:58:59

Bien sûr.. Pourquoi pas?
Les classes de base abstraites sont juste une commodité pour héberger le comportement et les données communes à 2 classes ou plus dans un seul endroit pour l'efficacité du stockage et de la maintenance. C'est un détail d'implémentation.
Veillez cependant à ne pas utiliser une classe de base abstraite où vous devriez utiliser une interface. Référez-vous à Interface vs classe de Base

6
répondu Gishu 2017-05-23 10:29:54

Bien sûr. Toute l'idée des classes abstraites est qu'elles peuvent contenir un comportement ou des données que vous avez besoin que toutes les sous-classes contiennent. Pensez à l'exemple simple de WheeledVehicle-il devrait avoir une variable membre numWheels. Vous voulez que toutes les sous-classes aient cette variable. Rappelez-vous que les classes abstraites sont une fonctionnalité très utile lors du développement D'API, car elles peuvent garantir que les personnes qui étendent votre API ne la casseront pas.

1
répondu 2008-10-25 11:49:29