通常,我们可以检查输入以确定在构造函数外部创建哪个子类。
在这个例子中,我们在main函数中检查它:
class Fruit
{
String name;
Fruit(String name)
{
this.name = name;
}
}
class Apple extends Fruit
{
Apple(String name)
{
super(name);
}
}
class Orange extends Fruit
{
Orange(String name)
{
super(name);
}
}
public static void main(String[] args)
{
String input = ""; // apple or orange
if(input.equals("Apple"))
Fruit f = new Apple("apple");
else if (input.equals("Orange"))
Fruit f = new Orange("orange");
}
我们如何在构造函数中检查它是否具有新的特定子类?
public static void main(String[] args)
{
Fruit f = new Fruit("apple");
}
abstract class Fruit
{
String name;
Fruit(String name)
{
if(name.equals("Apple"))
this = new Apple("apple");
else if (name.equals("Orange"))
this = new Orange("orange");
}
}
答案 0 :(得分:3)
首先,不要使用==
进行字符串比较。使用equals
。
其次,您无法在超类的构造函数中决定要创建实例的子类。当你调用new Fruit(...)
时,你创建了一个超类的实例,它不会在你的情况下通过编译,因为Fruit
是抽象的。即使它不抽象,也不能为this
分配任何内容。您无法更改要实例化的类的类型。
答案 1 :(得分:1)
我当晚正在读一本名为Effective Java的书,并讨论了这类问题。您可能想要了解的是Factory method pattern。为此,您可能会遇到以下情况:
public class Fruit {
...
public static Fruit createFruit(String name) {
if(name.equalsIgnoreCase("apple"))
return new Apple();
if(name.equalsIgnoreCase("orange"))
return new Orange();
...
return new Fruit(name);
}
...
}
然后,在创建新水果时,请改用:
Fruit apple = Fruit.createFruit("apple"); //returns an apple instance
Fruit orange = Fruit.createFruit("orange"); //returns an orange instance
Fruit fruit = Fruit.createFruit("watermelon"); //returns a basic fruit instance with watermelon as the name
编辑:更改了命名方案以反映工厂方法的真实用途;感谢Bartlomiej Lewandowski。