zoukankan      html  css  js  c++  java
  • 单根继承的好处

    最近在学习《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);
    	}
    
    }
    


    输出:



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

  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    690. Employee Importance
    1723. Find Minimum Time to Finish All Jobs
    LeetCode 329 矩阵中最长增长路径
    7.2 物理内存管理
    LeetCode 面试题 特定深度节点链表
    LeetCode 100 相同的树
    npm安装包命令详解,dependencies与devDependencies实际区别
  • 原文地址:https://www.cnblogs.com/lvlang/p/10586432.html
Copyright © 2011-2022 走看看