Как вызвать метод подкласса из объекта суперкласса

давайте предположим, что у меня есть этот родительский класс

public abstract class Parent
{
private String name;
private String surname;
public Parent(String name, String surname)
{
this.name=name;
this.surname=surname;
}

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

public class Child extends Parent
{

private String favColor;

public Child(String name,String surname,String favColor)
{
super(name,surname);
this.favColor=favColor;
}

public getFavColor()
{
return this.favColor
}

сейчас я в такой ситуации

Parent parent = new Child(name,surname,favColor);

и что я хочу сделать, это вызвать метод getFavColor () на родительском объекте, как это

parent.getFavColor();

это работает? Я думаю, нет, так как я могу вызвать такой метод для такого объекта? я думал об объявлении абстрактных методов получения дочерних атрибутов в суперклассе, но это не очень похоже на принцип открытия / закрытия, потому что в будущем, когда я захочу добавить больше дочерних классов, мне придется объявлять каждый получатели дочерних атрибутов в суперклассе, который не должен знать о своих детях.

большое Вам спасибо :)

Всего 2 ответа


Вам понадобится abstract метод, чтобы сделать это. Ваш родитель уже abstract так что это хорошо. Было бы что-то вроде этого:

public abstract class Parent {
    private String name;
    private String surname;
    public Parent(String name, String surname) {
        this.name = name;
        this.surname = surname;
    }

    public void showFavColor() {
        system.print.ln(this.getFavColor());
    }

    abstract string getFavColor();
}

public class Child extends Parent {

    private String favColor;

    public Child(String name, String surname, String favColor) {
        super(name, surname);
        this.favColor = favColor;
    }

    public abstact String getFavColor() {
        return this.favColor
    }
}

Каждый потомок родителя ДОЛЖЕН расширять абстрактную функцию. Поскольку функция технически объявлена ​​в родительском объекте, она доступна из нее.

Это означает, что вы могли бы сделать

Parent parent = new Child(name,surname,favColor);
parent.showFavColor();

В этом случае вы не можете вызвать метод getFavColor (). Метод определен только в дочернем классе, и ваша ссылка - Parent. Для этого необходимо определение метода getFavColor () в Parent Class. Вы должны создать абстрактный метод fav () в родительском классе:

public abstract class Parent
{
    private String name;
    private String surname;

    public Parent(String name, String surname)
    {
        this.name=name;
        this.surname=surname;
    }

    public abstract String fav();
}

Так называемый:

    parent.fav();

Таким образом, вы можете по-разному реализовать метод на ваших детях, например:

public class Child extends Parent 
{

    private String favColor;

    public Child(String name,String surname,String favColor)
    {
        super(name,surname);
        this.favColor=favColor;
    }

    public String fav()
    {
        return this.favColor;
    }
}

И:

public class SecondChild extends Parent 
{

    private String favSport;

    public Child(String name,String surname,String favColor)
    {
        super(name,surname);
        this.favColor=favColor;
    }

    public String fav()
    {
        return this.favSport;
    }
}

Используйте это, только если сигнатура методов одинакова для всех дочерних элементов (в вашем случае, если все дочерние методы возвращают строку).


Есть идеи?

10000