0
votes

Reportez-vous à la sous-classe «Ceci» au lieu de «Ceci» Superclass en Java?

J'ai construit une superclasse et un lot de sous-classes pour l'un de mes projets Java actuels - dans ce cas, je souhaite définir une fonction dans la superclasse, à hériter de toutes les sous-classes. Cette fonction utilisera "Ceci" afin de se référer aux attributs des sous-classes, mais cela fait actuellement référence aux attributs des Superclasses.

Fe, j'ai créé une superclasse et une sous-classe, où les deux classes ont l'attribut "valeur". Une fonction est utilisée pour imprimer la valeur, où "ceci" est censé référence à la classe actuelle. xxx

Dans ce cas, je veux cibler la valeur dans le Sous-classe (20), en utilisant "Ceci" pour faire référence à la classe actuelle. Mais, "ceci" fait actuellement référence à la "valeur" dans la superclasse, ce qui donne le même message imprimé pour toutes les sous-classes.

puis-je définir "Ceci" pour faire référence à la classe où la fonction est utilisée?


4 commentaires

Je pense que l'utilisation d'interfaces et de classes / méthodes abstraites peut être plus conforme à ce que vous essayez d'atteindre ici.


J'ai essayé de passer aux interfaces mais j'aurai besoin de superclasses à la place. Mon problème est maintenant que je dois mettre en œuvre la fonction dans chaque sous-classe pour atteindre "Ceci" pour chaque classe, qui se sent inefficace. N'a-t-il vraiment aucun moyen facile de définir «Ceci» pour désigner la classe appelant la fonction?


Les sous-classes ont-elles besoin d'un champ différent de la classe mère? Pourraient-ils simplement utiliser le champ du parent?


Oui, les attributs seront uniques pour chaque classe.


5 Réponses :


1
votes

Cela ne fonctionne pas car les champs ne peuvent pas être "remplacés" dans les sous-classes. Seules les méthodes peuvent être remplacées.

Vous pouvez obtenir l'effet que vous voulez si vous créez un getvalue méthode remplacer this.value avec un appel à getvalue . xxx


3 commentaires

Cela conduit au même scénario que OP essayait d'éviter où elles doivent mettre une méthode identique dans chaque sous-classe (la méthode GetValue ())


Voici comment fonctionne la résolution sur le terrain en Java. Toute autre solution nécessitera beaucoup plus de créativité,


Oui, c'est exactement mon problème actuel depuis que je définis les méthodes de chaque sous-classe, qui se sent extrêmement inefficace.



0
votes

La principale chose ici est que "n'essayez pas de remplacer les champs de superclasse" car Java ne le supporte pas. Si vous avez une "valeur" de champ en sous-classe, jetez-le et utilisez plutôt le champ de SuperClass. Créez une méthode de setter en Superclass pour définir la valeur ou utiliser le constructeur. Le code suivant fonctionnera: xxx

Si vous devez absolument avoir une "valeur" distincte dans la sous-classe, honnêtement, je pense que la conception de la classe est fausse. Vous devez nommer le champ différemment (E.g "valeur2") car Java traitera-la comme un champ différent de celui avec le même nom en Superclass. Concevez votre code pour avoir une valeur de ChildObject.setvalue (valeur2) quelque part avant d'appeler PrintValue ()


0 commentaires

0
votes

Nous allons utiliser le mot clé ce em> strong> pour accéder à la classe actuelle et utiliser le mot clé super em> strong> pour accéder à la superclasse. Nous ne pouvons pas accéder aux sous-classes dans la superclasse car il n'a pas de privilège. L'idée de l'héritage en Java est que vous pouvez créer de nouvelles classes reposant sur des classes existantes et avoir leurs propriétés uniques différentes de leurs parents. Si vous souhaitez accéder aux propriétés de SuperClass, vous devez écrire une méthode dans les sous-classes pour accéder. Si vous souhaitez toujours accéder aux propriétés de sous-classe en Superclass, pourquoi faire des sous-classes étendez la superclasse?

public class Main{
     public static void main(String[] args) {
            Child myObject = new Child();
            myObject.printValue();
            myObject.printSuperValue();
        }
}

    class Parent{
        private int value = 10;
        public void printValue(){
            System.out.println(this.value);
        }
    }

    class Child extends Parent{
        private int value = 20;


        @Override
        public void printValue(){
            System.out.println(this.value);
        }

        public void printSuperValue(){
            super.printValue();
        }
    }


1 commentaires

Merci, mais c'est exactement ma solution aujourd'hui, ce qui se sent mal depuis que j'ai besoin de beaucoup de valeurs dans chaque sous-classe, et doivent donc déclarer un lot de méthodes pour chaque classe, ce qui rend le code assez étendu.



0
votes

La réponse de base est que, à l'aide d'un accès variable simple, il n'existe aucun moyen de résoudre la variable de manière dynamique par rapport au type concret de l'instance qui est accessible. Quelle variable sera résolue est basée sur le type déclaré de l'instance qui est accessible. Par exemple: xxx

pour la résolution dynamique, des méthodes devront être utilisées.

Vous pouvez entraver partiellement cela, mais uniquement si les variables et les noms de sous-classe sont tous connus. à la superclasse. Par exemple: xxx

un getter pourrait être écrit dans la superclasse qui fait la même chose que "printme".

C'est tout ce qui est tout à fait laidée et n'est pas conseillé.


0 commentaires

0
votes

Une possibilité que vous pouvez divertir consiste à utiliser la réflexion pour accéder aux champs de la classe actuelle. La méthode getclass code> renvoie la classe actuelle de l'objet, donc pour un objet de la classe enfant, il retournera la classe enfant, même si le code est dans la classe mère. Vous pouvez accéder aux champs déclarés par cette classe à l'aide de la méthode getdeclaredfield () code>.

class Parent{
    private int value = 10;

    private int getValueWithReflection() {
        try {
            Field valueField = getClass().getDeclaredField("value");
            valueField.setAccessible(true);
            return valueField.getInt(this);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    public void printValue(){
        System.out.println(getValueWithReflection());
    }
}

class Child extends Parent{
    private int value = 20;
}


0 commentaires