如何从超类对象中调用子类方法

问题描述 投票:1回答:2

假设我有这个家长班

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();

这有效吗?我猜不是,所以我怎么能在这样的对象上调用这种方法?我想到了在超类上声明childs属性的抽象获取方法,但这听起来不太容易遵循开放/闭合原则,因为在将来的某个时候,当我想添加更多类似于child的类时,我将不得不声明每个超类中子属性的获取者,该父类不应该了解其子元素。

非常感谢:)

java inheritance abstract-class superclass
2个回答
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;
    }

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

父母的每个孩子必须扩展了抽象功能。由于该函数是在父级中声明的[[technically,因此可以从中访问它。

这意味着,你可以做

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


1
投票
在这种情况下,您不能调用getFavColor()方法。该方法仅在Child类中定义,您的引用为Parent。为此,必须在父类中定义getFavColor()方法。您可以在Parent类中创建一个抽象方法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; } }

仅在所有子代中方法的签名均相等时才使用此方法(在您的情况下,如果所有子代方法均返回String)。
© www.soinside.com 2019 - 2024. All rights reserved.