Pourquoi ne pouvons-nous pas remplacer une variable d'instance d'une super classe dans une sous-classe?
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).
Il a peut-être convenu d'essayer de remplacer la valeur utilisée pour initialiser la variable. Par exemple,
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";
// ...
}
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";
// ...
}
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.
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.)
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.
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.
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.
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.
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?