118 votes

Pourquoi ne pas le résumé?

Pourquoi ne peut-Java classes abstraites champs comme ils peuvent avoir des méthodes abstraites?

Par exemple: j'ai deux classes qui étendent la même classe de base abstraite. Ces deux classes ont chacune une méthode qui est identique sauf pour une constante de Chaîne, qui se trouve être un message d'erreur, en leur sein. Si les domaines de l'abstrait, j'ai pu faire cette constante abstraite et tirez la méthode dans la classe de base. Au lieu de cela, j'ai créer une méthode abstraite, appelés getErrMsg() dans ce cas, qui retourne la Chaîne, remplacez cette méthode dans les deux classes dérivées, et puis je peux tirer vers le haut la méthode (qui appelle la méthode abstraite).

Pourquoi ne pouvais-je viens de faire sur le terrain abstrait pour commencer? Pourrait Java ont été conçus pour permettre cela?

117voto

rsp Points 14367

Vous pouvez faire ce que vous avez décrit par un champ final dans votre classe abstraite qui est initialisé dans son constructeur (code non testé):

class Base {

    final String errMsg;

    Base(String msg) {
        errMsg = msg;
    }

    abstract String doSomething();
}

class Sub extends Base {

    Sub() {
        super("Sub message");
    }

    String doSomething() {

        return errMsg + " from something";
    }
}

Si votre enfant a de la classe "oublie" d'initialiser la finale grâce à la super constructeur, le compilateur va donner un avertissement une erreur, tout comme lorsqu'une méthode abstraite n'est pas mis en œuvre.

8voto

Felix Kling Points 247451

Je ne vois pas en qui. Vous pouvez déplacer la fonction de la classe abstraite et de substituer certaines protégées champ. Je ne sais pas si cela fonctionne avec des constantes, mais l'effet est le même:

public abstract class Abstract {
    protected String errorMsg = "";

    public String getErrMsg() {
        return this.errorMsg;
    }
}

public class Foo extends Abstract {
    public Foo() {
       this.errorMsg = "Foo";
    }

}

public class Bar extends Abstract {
    public Bar() {
       this.errorMsg = "Bar";
    }
}

Donc, votre point est que vous souhaitez appliquer la mise en œuvre/primordiale/quelle que soit l' errorMsg dans le sous-classes? Je pensais que tu voulais juste avoir de la méthode dans la classe de base et de ne pas savoir comment traiter avec le champ.

4voto

Laurence Gonsalves Points 50783

Évidemment, il pourrait avoir été conçu pour permettre cela, mais sous les couvertures, il faudrait toujours faire la distribution dynamique, et donc un appel de méthode. Java de la conception (au moins dans les premiers jours) a été, dans une certaine mesure, une tentative pour être minimaliste. Qui est, les concepteurs ont essayé d'éviter l'ajout de nouvelles fonctionnalités si elles pouvaient facilement être simulé par d'autres fonctions déjà dans la langue.

0voto

Drew Wills Points 4768

La lecture du titre, je pensais que vous faisiez référence à l'abstraction des membres de l'instance; et je ne vois pas l'utilité pour eux. Mais abstrait membres statiques est une tout autre affaire.

J'ai souvent souhaité que je pourrais déclarer une méthode comme celle-ci dans Java:

public abstract class MyClass {

    public static abstract MyClass createInstance();

    // more stuff...

}

En gros, je voudrais insister pour que des implémentations concrètes de ma classe parent de fournir un statique méthode de fabrique avec une signature spécifique. Cela me permettrait d'obtenir une référence à une classe de béton avec Class.forName() et soyez certains que je pouvais construire un, dans une convention de mon choix.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X