单根继承的好处

最近在学习《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.
", dad.TellMeYourName());
		son.Talk();
		
		Say(son);
	}

}


输出:



所以达到的好处就是我在写程序时参数指名用的是父类的名字,后面我无论传哪个子类进来,都能处理,并且只要稍加转换,就能利用到子类的特有方法。

原文地址:https://www.cnblogs.com/lvlang/p/10586432.html