web-dev-qa-db-fra.com

Remplacer les variables d'instance de super classe

Pourquoi ne pouvons-nous pas remplacer une variable d'instance d'une super classe dans une sous-classe?

27
Warrior

Parce que si vous avez modifié la mise en œuvre d'un membre de données, il serait probablement possible de casser la superclasse (Imaginez-vous modifier le membre de données de SuperClass d'un flotteur vers une chaîne).

21
cletus

Il a peut-être convenu d'essayer de remplacer la valeur utilisée pour initialiser la variable. Par exemple,

Au lieu de cela (ce qui est illégal)

public abstract class A {
    String help = "**no help defined -- somebody should change that***";
    // ...
}
// ...
public class B extends A {
    // ILLEGAL
    @Override
    String help = "some fancy help message for B";
    // ...
}

On devrait faire

public abstract class A {
    public String getHelp() {
        return "**no help defined -- somebody should change that***";
    }
    // ...
}
// ...
public class B extends A {
    @Override
    public String getHelp() {
        return "some fancy help message for B";
    // ...
}
49
Pierre D

Parce que vous pouvez seulement remplacer le comportement et non la structure. La structure est définie dans la pierre une fois qu'un objet a été créé et que la mémoire a été allouée pour cela. Bien sûr, cela est généralement vrai dans les langues typées statiquement.

9
Adrian Zanescu

Les variables ne sont pas accessibles polymorphiquement. Que voudriez-vous faire avec cela que vous ne pouvez pas faire avec une variable protégée? (Pas que j'encourage à utiliser des variables mutables non privées du tout, personnellement.)

5
Jon Skeet
class Dad{
    public String name = "Dad";
}
class Son extends Dad{
    public String name = "Son";
    public String getName(){
        return this.name;
    }
}

De la méthode principale () si vous appelez

new Son().getName();

retournera "fils", voici comment vous pouvez remplacer la variable de super classe.

2
ssi-anik

Voulez-vous dire que vous voulez demander de changer le type de données par exemple?

Que faites-vous avec cette expression

public class A {
   protected int mIndex;

   public void counter(){
      mIndex++;
   }

}

public class B extends A {
   protected String mIndex; // Or what you mean with overloading
}

Comment voulez-vous modifier l'expression de Mindex ++ sans surcharge de l'opérateur ou quelque chose comme ça.

0
Markus Lausberg

Si vous avez la nécessité de remplacer une variable d'instance, vous hérissez presque certainement de la classe Worng.

Dans certaines langues, vous pouvez masquer la variable d'instance en fournissant un nouveau:

class A has variable V1 of type X;

class B inherits from A, but reintroduces V1 of type Y.

Les méthodes de classe A peuvent toujours accéder à l'original v1. Les méthodes de classe B peuvent accéder au nouveau V1. Et s'ils veulent accéder à l'original, ils peuvent se faire renoncer au cours A (comme vous voyez la programmation sale provoque une progéniture plus sale).

La meilleure solution consiste à trouver un autre nom pour la variable.

0
Toon Krijthe

nous ne pouvons pas remplacer la structure des variables d'instance, mais nous remplacons leur comportement: -

class A
{
int x = 5;
}

class B extends A
{
int x = 7:
}

class Main
{
public static void main(String dh[])
{
A obj = new B();
System.out.println(obj.x);
}
}

dans ce cas, la sortie est de 5.

0
dheeraj

vous pouvez remplacer une méthode, tout va bien, mais que voulez-vous dire par une variable? Si vous souhaitez utiliser une variable à tout autre endroit plutôt que sur Super Class, vous pouvez utiliser Super. comme en super (noms variables); Pourquoi voulez-vous remplacer une variable? Je veux dire, y a-t-il besoin?

0
mahanuz