Как вызвать метод подкласса из объекта суперкласса - PullRequest
2 голосов
/ 16 января 2020

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

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 ]

2 голосов
/ 16 января 2020

В этом случае вы не можете вызвать метод 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;
    }
}

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

2 голосов
/ 16 января 2020

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

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;
    }

    @Override
    public String getFavColor() {
        return this.favColor
    }
}

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

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

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