如何从父类调用指定的方法?

时间:2013-05-09 06:43:58

标签: java inheritance

我有2个类从同一个父类扩展而来。在这些类中,我有相同名称但实现不同的方法。有没有办法从其父类调用此特定方法?请在下面找到示例代码

public class Fruit {

    public String callingName () {
        //calling specified method getTaste() here 
       // return specified value;
    }
}



public class Orange extends Fruit{
    private String getTaste(){
        return "Orange has sour taste";
    }
}

public class Banana extends Fruit{
    private String getTaste(){
        return "Banana has sweet taste";
    }
}

在这种情况下,我对香蕉或橙子没有任何提及。 Fruit类本身必须决定从callName()方法调用哪个是正确的getTaste()。 谢谢你的帮助。

5 个答案:

答案 0 :(得分:1)

是的,使用抽象类

public abstract class Fruit {

    protected abstract String getTaste();

    public String callingName () {
         String taste = getTaste(); //calling specified method getTaste() here 
        // return specified value; 
    }
}

您必须在每个类中保护getTaste()。

答案 1 :(得分:1)

尝试使用工厂模式的概念:

public String callingName (String fruit) {
        switch(fruit){
        case "Orange" :
         return new Orange().getTaste();
        case "Banana" :
            return new Banana().getTaste();
        }
    }

在这里,您不需要将Fruit类创建为抽象,您可以创建它的对象。

答案 2 :(得分:0)

实施

public abstract class Fruit {
    public abstract String getTaste ();
    public String callingName () {
        //calling specified method getTaste() here 
       // return specified value;
    }
}

答案 3 :(得分:0)

我看到最好的方法,因为你不可能实例化它,所以使Fruit成为抽象的。

给它一个名为 name 的受保护属性,以及一个相关的方法(我将使用 getName 而不是 callingName 来遵循约定) 。

Orange Banana 的构造函数中,只需使用正确的值分配属性 name ,并覆盖 getName 方法。

因此:

public abstract class Fruit {
    protected String name;
    public String getName() {
        return name;
    }
}


public class Banana extends Fruit {
    public Banana() {
        name = "Banana";
    }
    public String getName() {
        return super.getName();
    }
}

答案 4 :(得分:0)

它是Java继承的内置功能。如果扩展类的实例是up-casted,则调用其方法,仍将调用其原始方法。它也是Java中面向对象实现的基本概念。

class Fruit {
    protected String callingTaste() {
        return "";
    }

    public String callingName() {
        return callingTaste();
    }
}

您可以使用以下示例测试上述概念:

class FruitProducer {
    public static Fruit[] produce() {
        Fruit[] list = new Fruit[] { new Orange(), new Banana() };
        return list;
    }
}

class UnknownClient {
    public static void main(String args[]) {
        Fruit[] listOfFruit = FruitProducer.produce();
        foreach (Fruit f : listOfFruit) {
            f.callingName(); 
        }
    }
}