单根继承的好处
最近在学习《Thinking in java》一书,在书中作者提到了单根继承的好处(对比java和C++)。
先引用下书本上的原文解释对单根继承的阐述:
书上的解释比较笼统,所以自己网搜了下,最后去到stack overflow找到个还比较好比较完整的答案。较详细的说明了部分好处:
我把它用自己的话来重新阐述一遍:
1:参数传递,因为往往写函数时不明确要传入的类是怎样的,所以可以这样:
public void function(Object obj)
也就是在参数传入的是一个父类,就不用说在编写函数时非得明确传入的是哪个子类了。因为传入的是父类,所以如果想要使用子类的方法,那么就需要时用到强制类型转换,将父类转化为子类。下面有我写的一个示例。
2:每个类都具有了基础的功能,也就是object类的那些功能,比如 ToString() , GetType()。这点很容易理解,有个回答者还说到,你可以去extend Object类的功能,那其他所有类都具有更强大的基础功能。
3:方便垃圾回收机制的实现,其实就是方便找到垃圾所在的位置,从根类object开始一层层往下找。这个特点偏向于语言开发者~
4:方便异常处理,写异常函数的时候并不知道要抛的是哪个子类的异常,如果写明了是抛哪个子类的异常,那别的子类就用不了这个异常函数了,跟参数传递差不多的道理,所以直接抛一个父类的异常……这个可能描述得有差错,尚待讨论。
5:其实说到底,语言这样设计的目的无他,就是为了代码复用或者方便写代码或者带来更好的程序执行效率。
附一个上面说到的在参数传递优点的小示例程序:
1.父类Dad.java:
/**
* Dad class,Test for inheritance
*/
package hello;
/**
* @author lv.lang
*
*/
public class Dad {
private String name;
private int ate;
/**
*
*/
public Dad() {
// TODO Auto-generated constructor stub
this.name = "LvLang";
this.ate = 36;
}
public Dad(String name,int ate)
{
this.name = name;
this.ate = ate;
}
public void Talk()
{
System.out.println("I can talk.");
}
public int TellMeYourAte()
{
return this.ate;
}
public String TellMeYourName()
{
return this.name;
}
}
2.子类Son.java
/**
* Son class,Test for inheritance
*/
package hello;
/**
* @author lv.lang
*
*/
public class Son extends Dad{
private double salary;
public Son()
{
this.salary = 10000;
}
public Son(double salary)
{
this.salary = salary;
}
@Override
public void Talk()
{
System.out.println("I am Son, and I can talk loudly!");
}
public double TellMeYourSalary()
{
return this.salary;
}
}
3.main文件main.java:
/**
* This is main file.
*/
package hello;
/**
* @author lv.lang
*
*/
public class Main {
public static void Say(Dad in)
{
//强制类型转换将传入的对象转为Son类型从而下面才能使用子类特有的方法
/*方法一:新开一个子类对象然后用=赋值*/
Son input = (Son)in; //这句相当于Son input = new Son(); input = (Son)in;
double salary = input.TellMeYourSalary();
/*方法二:直接转换后立即调用子类方法,注意括号的使用*/
//double salary = ((Son)in).TellMeYourSalary();
System.out.println(salary);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Dad dad = new Dad();
Son son = new Son(2000);
dad.Talk();
System.out.printf("My name is %s.\n", dad.TellMeYourName());
son.Talk();
Say(son);
}
}
输出:
所以达到的好处就是我在写程序时参数指名用的是父类的名字,后面我无论传哪个子类进来,都能处理,并且只要稍加转换,就能利用到子类的特有方法。