Fox.breed()和Rabbit.breed()几乎一样
Fox.breed()和Rabbit.breed()几乎一样,有什么好办法修改?注意Fox和Rabbit的breed()返回的具体类型不同。
修改之前的代码:
//Animal类
public abstract Animal breed();
//Rabbit类
@Override public Animal breed()
{
Animal ret=null;
if(sBreedable()&&Math.random()<0.12)
{
ret=new Rabbit();
}
return ret;
}
//Fox类
@Override
public Animal breed()
{
Animal ret=null;
if(sBreedable()&&Math.random()<0.5)
{
ret=new Fox();
}
return ret;
}
修改之后:
Animal类:
public Animal breed()
{
Animal ret=null;
if(isBreedable()&&Math.random()<getValue())
{
ret=getAnimal();
}
return ret;
}
public abstract Animal getAnimal();
public abstract double getValue();
把其中的变量都变成抽象函数,实现的时候传回参数
Rabbit类实现:
@Override
public Animal breed() {
return super.breed();
}
@Override
public Animal getAnimal() {
return new Rabbit();
}
@Override
public double getValue() {
return 0.12;
}
Fox类实现:
@Override
public Animal breed() {
return super.breed();
}
@Override
public Animal getAnimal() {
return new Fox();
}
@Override
public double getValue() {
return 0.5;
}
更改之后的代码具有更好的可扩展性,内容可以直接在Animal里面加,不用分别在Rabbit和Fox单独加内容,消除了重复代码,这是一个良好的代码。
补一个Java关键字,为下一篇的注释做准备:
instanceof关键字,它是用来检验该对象是某个类的实例:
/*
author by runoob.com
Main.java
*/
import java.util.ArrayList;
import java.util.Vector;
public class Main {
public static void main(String[] args) {
Object testObject = new ArrayList();
displayObjectClass(testObject);
}
public static void displayObjectClass(Object o) {
if (o instanceof Vector)
System.out.println("对象是 java.util.Vector 类的实例");
else if (o instanceof ArrayList)
System.out.println("对象是 java.util.ArrayList 类的实例");
else
System.out.println("对象是 " + o.getClass() + " 类的实例");
}
}
代码来自"菜鸟学java"
运行结果:对象是 java.util.ArrayList 类的实例