Доступ к свойству / константе в расширенных классах - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь добиться следующего:

У меня есть родительский класс с некоторой логикой.В дочернем классе я «переопределяю» константы / свойства.Есть ли способ сделать дочерние свойства доступными методами, определенными в родительском классе?Или, если быть более точным, есть ли способ заставить метод "out" написать extended вместо base в следующем примере?

public class BaseTest {
    public static final String x = "base";

    public void out() {
        System.out.println(x);
    }
}

public class ExtendedTest extends BaseTest{
    public static final String x = "extended";
}

public class Main {
    public static void main(String[] args) {
        BaseTest base = new BaseTest();
        ExtendedTest extended = new ExtendedTest();
        base.out(); // base (as expected)
        extended.out(); // base (extended expected)
        System.out.println(extended.x); // extended (as expected)
    }
}

Iпроисходят в основном из мира PHP, где этот подход работает просто отлично.Не знаю, если я что-то упустил или если сам дизайн Java не позволяет этого.

Спасибо.

Примечание: не важно , независимо от того, является ли свойствостатический или нет.Я просто хотел иметь возможность переопределить свойство любого вида в дочернем классе (точно так же, как я могу переопределить метод), которое, на основании ответов, которые я получил до сих пор, не представляется возможным в Java.В PHP это абсолютно возможно, поэтому я и задал вопрос.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Статические члены разрешаются во время компиляции, и добавление ExtendedTest.x не влияет на также существующий BaseTest.x, с которым связан метод BaseTest#out().

Для выполнения чеговы хотите, вам нужен переопределенный метод:

public class BaseTest {
    public String x() {
        return "base";
    }

    public final void out() {
        System.out.println(x());
    }
}

public class ExtendedTest extends BaseTest {
    @Override
    public String x() {
        return "extended";
    }
}

Этот шаблон обычно используется с абстрактным методом в базовом классе или интерфейсе, чтобы подкласс определял атрибут, такой как имя или ключ.

0 голосов
/ 18 февраля 2019

static поля не подлежат наследованию. x в теле метода out() относится к BaseTest.x.Поскольку вы не переопределяете out(), тело метода out() по-прежнему печатает значение BaseTest.x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...