Java 在运行时分配具体的实现对象
Java Assign the concrete implementation object at runtime
我正在阅读超类型编程部分中的 Head First Design Patterns 一书。
书中解释说,最佳实践是使用函数 getAnimal()。
疑问:
- 如何实际实现 a = getAnimal() 函数?我测试了我理解的内容,但是我不确定我是否正确。
以下是本书的节选:
“编程实现将是:
Dog d = new Dog();
d.bark();
但是编程为 interface/supertype 将是:
Animal animal = new Dog();
animal.makeSound();
更好,而不是硬编码的实例化
子类型(如 new Dog())到代码中,分配具体的
运行时的实现对象:
a = getAnimal();
a.makeSound();
这是我目前所知道的,但是我不确定我是否清楚地理解了这个概念,这种类型的实现会是书中的意思吗?
abstract class Animal {
abstract void makeSound();
}
public class Dog extends Animal{
void bark(){
System.out.println("Bark");
}
@Override
void makeSound() {
bark();
}
public static void main(String[] args){
Animal animal=new Dog();
animal.makeSound();
}
}
public class ConcreteAnimal extends Animal {
Animal animal;
@Override
void makeSound() {
animal.makeSound();
}
Animal getAnimal() {
Animal dog = new Dog();// Is this correct?
return dog;
}
public static void main(String[] args) {
ConcreteAnimal ca = new ConcreteAnimal();
Animal a = ca.getAnimal();// How to call getAnimal() without an object nor class name?
a.makeSound();//It prints the Bark as expected.
}
}
谢谢
使用工厂方法模式创建 Animal 对象。使用 AnimalFactoryDemo class 而不是 ConcreteAnimal class。它应该看起来像这样:
public class AnimalFactoryDemo
{
public static void main(String[] args)
{
Animal animal = AnimalFactory.getAnimal("Dog");
animal.makeSound();
}
}
public class AnimalFactory
{
public static Animal getAnimal(String Animal)
{
if (type.equals("Dog"))
return new Dog();
else if (type.equals("Cat"))
return new Cat();
else
return null;
}
}
我正在阅读超类型编程部分中的 Head First Design Patterns 一书。 书中解释说,最佳实践是使用函数 getAnimal()。 疑问:
- 如何实际实现 a = getAnimal() 函数?我测试了我理解的内容,但是我不确定我是否正确。
以下是本书的节选:
“编程实现将是:
Dog d = new Dog();
d.bark();
但是编程为 interface/supertype 将是:
Animal animal = new Dog();
animal.makeSound();
更好,而不是硬编码的实例化 子类型(如 new Dog())到代码中,分配具体的 运行时的实现对象:
a = getAnimal();
a.makeSound();
这是我目前所知道的,但是我不确定我是否清楚地理解了这个概念,这种类型的实现会是书中的意思吗?
abstract class Animal {
abstract void makeSound();
}
public class Dog extends Animal{
void bark(){
System.out.println("Bark");
}
@Override
void makeSound() {
bark();
}
public static void main(String[] args){
Animal animal=new Dog();
animal.makeSound();
}
}
public class ConcreteAnimal extends Animal {
Animal animal;
@Override
void makeSound() {
animal.makeSound();
}
Animal getAnimal() {
Animal dog = new Dog();// Is this correct?
return dog;
}
public static void main(String[] args) {
ConcreteAnimal ca = new ConcreteAnimal();
Animal a = ca.getAnimal();// How to call getAnimal() without an object nor class name?
a.makeSound();//It prints the Bark as expected.
}
}
谢谢
使用工厂方法模式创建 Animal 对象。使用 AnimalFactoryDemo class 而不是 ConcreteAnimal class。它应该看起来像这样:
public class AnimalFactoryDemo
{
public static void main(String[] args)
{
Animal animal = AnimalFactory.getAnimal("Dog");
animal.makeSound();
}
}
public class AnimalFactory
{
public static Animal getAnimal(String Animal)
{
if (type.equals("Dog"))
return new Dog();
else if (type.equals("Cat"))
return new Cat();
else
return null;
}
}