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);
    	}
    
    }
    


    输出:



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

  • 相关阅读:
    C++ char和string的区别
    解读机器学习基础概念:VC维的来龙去脉 | 数盟
    链接集锦
    MSSQL数据库日志满的快速解决办法
    oracle执行update时卡死问题的解决办法
    正则表达式中/i,/g,/ig,/gi,/m的区别和含义
    windows下sqlplus怎么连接远程oracle
    C#中TransactionScope的使用方法和原理
    C#设置Cookies .
    IIS7及以上伪静态报错404
  • 原文地址:https://www.cnblogs.com/lvlang/p/10586432.html
Copyright © 2011-2022 走看看