инициировать атрибут A в зависимости от атрибутов B и C эффективно

1
public abstract class SuperClass {
    public int x, y;
    public int z = x + y;
}

каждый подкласс SuperClass должен иметь атрибуты x, y и z. Но в то время как x и y могут быть разными для всех подклассов и поэтому должны быть инициированы вручную, как я могу быть уверенным в инициировании z? т.е. я не хочу называть z = x + y в каждом подклассе SuperClass.

Теги:
initialization
superclass
abstract

2 ответа

1
Лучший ответ

Я не хочу называть 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;
}

}

  • 0
    Ответили 17 минут назад? Я мог видеть ваш ответ только в течение 15 с чем-то секунд, а затем он исчез. Это было странно.
  • 0
    У меня были опечатки, я вытащил их, чтобы исправить их ... Я проверяю затмение моего синтаксиса.
2

Сделайте 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;
}
  • 0
    Хорошо .. х и у неизвестны до создания отдельного подкласса. Я не могу дать им никаких логических значений по умолчанию; что означает, что я не могу определить z = x + y в суперструкторе, потому что его нужно будет вызывать перед инициализацией x и y в подклассе.
  • 0
    вычислить значение для z в соответствующих методах установки, как я предложил. это самое простое решение здесь.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню