0

我有 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";
    }
}

在这种情况下,我没有提及 Banana 或 Orange。Fruit 类本身必须决定哪个是正确的 getTaste() 将从 callName() 方法中调用。感谢您提供任何帮助。

4

5 回答 5

1

是的,使用抽象类

public abstract class Fruit {

    protected abstract String getTaste();

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

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

于 2013-05-09T06:47:47.973 回答
1

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

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

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

于 2013-05-09T06:50:15.687 回答
0

实施

public abstract class Fruit {
    public abstract String getTaste ();
    public String callingName () {
        //calling specified method getTaste() here 
       // return specified value;
    }
}
于 2013-05-09T06:48:13.290 回答
0

我看到的最好方法是让 Fruit 抽象,因为你不太可能实例化它。

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

OrangeBanana的构造函数中,只需为属性名称分配正确的值,并覆盖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();
    }
}
于 2013-05-09T06:55:44.613 回答
0

它是 Java 继承的一个内置特性。如果扩展类的实例被向上转换,那么它的方法被调用,它的原始方法仍然会被调用。它也是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(); 
        }
    }
}
于 2013-05-09T06:56:18.327 回答