Переопределение родительской переменной класса с расширенной дочерней переменной - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь расширить класс, в котором есть переменная, которую мне также необходимо расширить. Есть ли «хороший» способ добиться этого?

У меня расширен родительский класс и переменная из родительского класса. Теперь мне нужно использовать расширенную переменную в дочернем классе. Вот псевдокод:

public class Parent {

    private ParentVariable variableToUse;
    //getters, setters
}

public class ParentVariable {
    //some fields
}

public class ChildVariable extends ParentVariable {
    //more fields
}

public class Child extends Parent {

    private ChildVariable variableToUse;
    //getters, setters
}

Как мне переопределить "variableToUse", чтобы каждый раз, когда я пытался получить доступ к этой переменной из "Child", я получал бы "ChildVariable" вместо "ParentVariable"?

1 Ответ

0 голосов
/ 19 июня 2019

Вы будете эффективно скрывать здесь родительскую переменную, включив "variableToUse" в дочерний класс.

Поскольку variableToUse в любом случае относится к типу ParentVariable, я предлагаю вам вообще исключить его из ChildClass и использоватьгеттер, который обеспечивает тип.Например -

public class Child extends Parent {

    //private ChildVariable variableToUse; -> remove this

    private ChildVariable checkAndGetChildVariable() {
          if(variableToUse instanceof ChildVariable) {
                return (ChildVariable)variableToUse;
          }
          return null;//Or throw exception
    }
}

Для большей ясности, убедитесь в этом в конструкторе

public class Child extends Parent {

    //private ChildVariable variableToUse; -> remove this
    public Child(ParentVariable variable) {
          super(checkChildVariable(variable));
    }

    private static ChildVariable checkChildVariable(ParentVariable variable) {
          if(variable instanceof ChildVariable) {
                return (ChildVariable)variable;
          }
          throw UnsupportedOperation("invalid type");
    }
}
...