如果一个类是另一个类的扩展或延伸,那么可以考虑是否可以用继承,另外还需要权衡使用继承后这个对象是否受制于父类,是否降低了灵活性。继承只是继承父类的特性而不能了解父类所有的东西,比如私有的函数、属性等。而抽象是父子间相同的问题不能达成共识的时候就需要使用了,毕竟每个人有每个人的思考方式,不能把个人的意志强加于他人身上。所以,抽象是继承的一个升级,广开言路、求同存异耳。
public class Father
{
private String name;
private int age;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
@SuppressWarnings("unused")
private void playCard(){
System.out.println("打牌");
}
}
public class Son extends Father
{
public void work(){
System.out.println("工作");
}
}
儿子和父亲虽然都有名字和年龄,但儿子并不知道父亲会打牌、父亲也不知道儿子能工作。如果轻率地改变父亲的私有方法那么儿子就会学会打牌了,儿子如果以打牌为乐、是不是会忘了工作呢?所以,继承也并非什么都好,子类会被父类影响那么最好慎用继承。显然,儿子可以拒绝在工作的时候玩牌,但是就需要增加工作时不能玩牌的逻辑处理了。所以,修改后的代码是这样:
public class Son extends Father
{
public void work(){
System.out.println("工作");
}
@SuppressWarnings("deprecation")
private boolean canPlayCard(){
Date date=new Date();
if(date.getHours()>=9&&date.getHours()<=18){
return false;
}
return true;
}
@Override
public void playCard()
{
boolean canPlayCard=canPlayCard();
if(canPlayCard){
super.playCard();
}else{
System.out.println("工作时间不能玩牌");
}
}
}
这时候就可以考虑使用抽象类来实现了,不在需要使用继承受父类的影响了。
public abstract class AbstractClass
{
private String name;
private int age;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public abstract void playCard();
}
现在Father、Son继承这个抽象类实现自己的玩牌规则就行了:
public class Father extends AbstractClass
{
public void playCard(){
System.out.println("打牌,没完没了的打");
}
}
public class Son extends AbstractClass
{
public void work(){
System.out.println("工作");
}
public void playCard()
{
System.out.println("玩牌规则:工作时间不能玩牌,只能工作");
}
}
以前儿子见不惯父亲只会打牌,儿子以此为耻给自己定下了打牌的规矩,从这里看出Father和Son已经断绝父子关系了,故事讲诉完毕。