抽象类与抽象方法的使用
2016-11-28 20:45
435 查看
学了这么长时间的抽象类与抽象方法,只是看别人这么设计,这么写。现在终于在项目中实际使用了。下面抽象出来,阐述下。
在现有的系统下,已经有了下面的实现:
假设这个食草动物,每次eat之前都要洗手、盛饭,吃完之后都要洗碗。
当然应用的时候自然是:
这种设计是没有任何问题的。但是,在工程后面的迭代过程中,可能出现了一种肉食动物,他们也eat,他们在吃饭之前也要洗手、盛饭,吃完饭也要洗碗,怎么办?难道像下面这样实现?
如果你没有发现这里有很多冗余代码的话(当然这里比较简单,如果在实际项目中,代码要复杂的多,你可能真的无法发现这些冗余),而你恰巧使用的是IDEA工具,这时IDEA会给你冗余的代码划很多波浪线,提示这些是冗余的代码。怎么办?怎么去除这些冗余呢?但是他们吃的确实不一样啊?一个吃草,一个吃肉?
这样抽象类和抽象方法就应运而生了。请看实现:
Animal.java
AbstractAnimal.java
GrassAnimal.java
MeatAnimal.java
Main.java
输出结果如下:
在现有的系统下,已经有了下面的实现:
package org.fan.animal; /** * Created by fan on 2016/11/28. */ public interface Animal { void doEat(); }
假设这个食草动物,每次eat之前都要洗手、盛饭,吃完之后都要洗碗。
package org.fan.animal; /** * Created by fan on 2016/11/28. */ public class GrassAnimal implements Animal { @Override public void doEat() { //洗手 //盛饭 System.out.println("eat grass!"); //洗碗 } }
当然应用的时候自然是:
package org.fan.animal; /** * Created by fan on 2016/11/28. */ public class Main { public static void main(String[] args) { Animal grassAnimal = new GrassAnimal(); grassAnimal.doEat(); } }
这种设计是没有任何问题的。但是,在工程后面的迭代过程中,可能出现了一种肉食动物,他们也eat,他们在吃饭之前也要洗手、盛饭,吃完饭也要洗碗,怎么办?难道像下面这样实现?
package org.fan.animal; /** * Created by fan on 2016/11/28. */ public class MeatAnimal implements Animal { @Override public void doEat() { //洗手 //盛饭 System.out.println("eat meat!"); //洗碗 } }
如果你没有发现这里有很多冗余代码的话(当然这里比较简单,如果在实际项目中,代码要复杂的多,你可能真的无法发现这些冗余),而你恰巧使用的是IDEA工具,这时IDEA会给你冗余的代码划很多波浪线,提示这些是冗余的代码。怎么办?怎么去除这些冗余呢?但是他们吃的确实不一样啊?一个吃草,一个吃肉?
这样抽象类和抽象方法就应运而生了。请看实现:
Animal.java
package org.fan.animal; /** * Created by fan on 2016/11/28. */ public interface Animal { void doEat(); }
AbstractAnimal.java
package org.fan.animal; /** * Created by fan on 2016/11/28. */ public abstract class AbstractAnimal implements Animal { public void doEat() { //洗手 //盛饭 eat(); //洗碗 } public abstract void eat(); }
GrassAnimal.java
package org.fan.animal; /** * Created by fan on 2016/11/28. */ public class GrassAnimal extends AbstractAnimal { @Override public void eat() { System.out.println("eat grass!"); } }
MeatAnimal.java
package org.fan.animal; /** * Created by fan on 2016/11/28. */ public class MeatAnimal extends AbstractAnimal { @Override public void eat() { System.out.println("eat meat!"); } }
Main.java
package org.fan.animal; /** * Created by fan on 2016/11/28. */ public class Main { public static void main(String[] args) { Animal meatAnimal = new MeatAnimal(); Animal grassAnimal = new GrassAnimal(); meatAnimal.doEat(); grassAnimal.doEat(); } }
输出结果如下:
eat meat! eat grass!
相关文章推荐
- C#多态性-抽象类和抽象方法的使用
- java中抽象类与抽象方法的使用问题
- C#多态性-抽象类和抽象方法的使用
- java中抽象类与抽象方法的使用问题
- 抽象类和抽象方法的初步理解和使用
- 面向对象,类的组合关系,继承,实现,方法重写,方法重载,this的使用,抽象方法和抽象类的比较,父类构造方法存在的意义,多态的是用和解析,各种访问修饰符
- java中抽象类与抽象方法的使用问题
- 抽象类与抽象方法的使用
- java中抽象类与抽象方法的使用问题
- 抽象类和抽象方法的定义和使用
- java中抽象类与抽象方法的使用问题
- 为什么要在定义抽象类时使用abstract关键字
- 第十节--抽象方法和抽象类 -- Classes and Objects in PHP5 [10](转)
- 在C#中使用虚方法、重写方法和抽象方法实现表达式运算
- C#中接口和抽象类的使用上的主要差别在哪里?
- 为什么要在定义抽象类时使用abstract关键字
- 抽象类的使用
- 抽象类和抽象方法
- C#的抽象类和抽象方法
- 在VB.NET中使用抽象类