2008-10-25 9 views
20

Est-ce une bonne pratique de laisser les classes abstraites définir des variables d'instance?Java - Classe abstraite pour contenir des variables?

public abstract class ExternalScript extends Script { 

    String source; 

    public abstract void setSource(String file); 

    public abstract String getSource(); 
} 

La sous-classe, ExternalJavaScript.class, serait alors obtenir automatiquement la variable source, mais je pense qu'il est plus facile de lire le code si toutes les sous-classes définissent eux-mêmes la source, au lieu de droits de succession.

Quel est votre conseil?

/Adam

Répondre

29

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? Vos getter/setters devraient faire ce qu'ils disent sur la boîte.

public abstract class ExternalScript extends Script { 

private String source; 

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

public String getSource() { 
    return source; 
} 

Apporter ce retour à la question, ne vous dérange pas toujours regarder où le code getter/setter est lors de la lecture? Si tout se passe et se règle, vous n'avez pas à vous soucier de ce que la fonction «fait» en lisant le code. Il y a quelques autres raisons de penser aussi:

  • Si la source est protégée (donc accessible par les sous-classes) puis le code devient malpropre: révolution qui change les variables? Quand c'est un objet, il devient difficile de refactoriser, alors qu'une méthode a tendance à faciliter cette étape.
  • Si vos méthodes getter/setter ne sont pas configurées, définissez-les comme quelque chose d'autre.

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

6

Bien sûr .. Pourquoi pas?
Les classes de base abstraites sont juste une commodité pour loger 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 toutefois à ne pas utiliser une classe de base abstraite dans laquelle vous devriez utiliser une interface. Référez-vous à Interface vs Base class

1

Bien sûr. L'idée générale des classes abstraites est qu'elles peuvent contenir un comportement ou des données que vous souhaitez que toutes les sous-classes contiennent. Pensez à l'exemple simple de WheeledVehicle - il devrait avoir une variable membre de 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 cassent pas.

Questions connexes