public abstract class SuperClass {
public int x, y;
public int z = x + y;
}
каждый подкласс SuperClass должен иметь атрибуты x, y и z. Но в то время как x и y могут быть разными для всех подклассов и поэтому должны быть инициированы вручную, как я могу быть уверенным в инициировании z? т.е. я не хочу называть z = x + y
в каждом подклассе SuperClass.
Я не хочу называть z = x + y в каждом подклассе SuperClass.
Просто укажите za значение по умолчанию в вашем суперклассе, например, x + y, или оставьте поле пустым, если хотите. Затем в подклассе определите z, как вы хотите, в конструкторе.
public class SuperClass{
int x, y, z;
SuperClass(int x, int y){
this.x = x;
this.y = y;
//pick a default value of z;
z = x + y;
}
}
public class Example extends SuperClass {
Example(int x, int y){
super(x , y);
//pick another z implementation here;
z = x * y ^ x;
}
}
Сделайте x
y
protected
или сделайте их доступными для подклассов с помощью соответствующих методов getter и setter. В противном случае подклассы их не видят.
Чтобы инициализировать z, вы можете установить его в конструкторе вашего SuperClass
следующим образом:
Superclass(int x, int y)
{
this.x = x;
this.y = y;
this.z = x + y;
}
В ваших унаследованных классах используйте super(x,y)
в своем конструкторе для вызова конструктора SuperClass
.
Теперь об инициализации их... Я не знаю, чего вы хотите достичь, но если вы хотите изменить x
и y
чтобы z
сохранялось в соответствии с x + y
, вы должны сделать это вручную. Одним из способов достижения этого является вычисление z в методах setter для x
и y
.
Редактировать:
Соответствующие сеттеры:
void setX(int x)
{
this.x = x;
z = x + y;
}
void setY(int y)
{
this.y = y;
z = x + y;
}
z = x + y
в суперструкторе, потому что его нужно будет вызывать перед инициализацией x и y в подклассе.
z
в соответствующих методах установки, как я предложил. это самое простое решение здесь.