首页 > 解决方案 > 如何从超类对象调用子类方法

问题描述

假设我有这个父类

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

这管用吗?我猜不是,那么我怎么能在这样的对象上调用这样的方法呢?我想过在超类上声明子类属性的抽象获取器,但这听起来不太容易遵循开放/封闭原则,因为在将来我想要添加更多类似子类的类时,我将不得不声明每个超类中子属性的获取者不应该知道他的孩子。

非常感谢您 :)

标签: javainheritanceabstract-classsuperclass

解决方案


在这种情况下,您不能调用 getFavColor() 方法。该方法仅在子类中定义,您的参考是父类。为此,必须在父类中定义 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;
    }
}

仅当所有子方法的签名都相等时才使用此方法(在您的情况下,如果所有子方法都返回一个字符串)。


推荐阅读