Question

Est-ce une bonne pratique de laisser les classes abstraites définir les 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 j'estime qu'il est plus facile de lire le code si toutes les sous-classes définissent elles-mêmes la source plutôt que par héritage.

Quel est votre conseil?

/ Adam

Était-ce utile?

La solution

J'aurais pensé que quelque chose comme cela serait beaucoup mieux, puisque vous ajoutez une variable, alors pourquoi ne pas restreindre l'accès et le rendre plus propre? Vos getter / setters doivent faire ce qu’ils disent sur l’étain.

public abstract class ExternalScript extends Script {

private String source;

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

public String getSource() {
    return source;
}

Pour en revenir à la question, avez-vous déjà pris la peine de regarder où se trouve le code de lecture / définition lors de la lecture? S'ils obtiennent tous et définissent, vous n'avez pas besoin de vous inquiéter de ce que la fonction "fait" lors de la lecture du code. Il y a quelques autres raisons à considérer:

  • Si la source était protégée (donc accessible par des sous-classes), le code devient confus: qui modifie les variables? Quand il s’agit d’un objet, cela devient difficile lorsque vous avez besoin de refactoriser, alors qu’une méthode tend à faciliter cette étape.
  • Si vos méthodes getter / setter n'obtiennent pas et ne définissent pas, décrivez-les autrement.

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

Autres conseils

Bien sûr. Pourquoi pas?
Les classes de base abstraites ne sont qu'un moyen pratique de gérer 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 de mise en œuvre.
Veillez toutefois à ne pas utiliser une classe de base abstraite dans laquelle vous devriez utiliser une interface. Consultez la classe Interface vs Base

.

Bien sûr. L'idée des classes abstraites est qu'elles peuvent contenir un comportement ou des données que toutes les sous-classes doivent contenir. Pensez à l'exemple simple de WheeledVehicle - il devrait avoir une variable membre numWheels. Vous voulez que toutes les sous-classes aient cette variable. N'oubliez pas 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top