zoukankan      html  css  js  c++  java
  • 抽象类和接口

    抽象类和接口的问题在网上可谓海量文章,资料颇丰。今天我也总结一下,主要是整理一下自己的思路,如果有人看到觉得有点帮助就更好了。

    关于抽象类和接口的语法我就不多说了,首先来说说为什么要使用抽象类

    我们用天一时代老师的例子,比如说银行的一个类,该类能根据本金和利率得到利息。我们可以写出这样一份代码:

    public class LoanAccount {
                private double fund; // 本金
    
                public double calculateInterest() // 计算利息
                {
                    // 利息=本金*利率
                    return fund * getInterestRate();
                }
    
                public double getInterestRate() {
                    return 0.2;
                }
            }

     

    很明显,每家银行都需要这样来计算利息,也就是说会有很多类需要这个类中的方法,因此,为了复用这个类的代码,这个类可能被其他的银行来继承。这时,问题出现了,每家银行的利率不一样,那这个父类的利率到底要返回多少呢,我们不可能知道具体的数字,只能靠子类去完成这项任务,这时候这个方法就不能具体的去实现了,所以有了抽象方法。

    public abstract class LoanAccount {
                private double fund; // 本金
    
                public double calculateInterest() // 计算利息
                {
                    // 利息=本金*利率
                    return fund * getInterestRate();
                }
    
                public abstract double getInterestRate();
            }

    这样,无论哪个银行要继承这个类,只要在getInterestRate中返回自己的利率就可以了。


    那我们现在是否知道了为什么要使用抽象类

    答案就是:因为在定义我们要做什么的时候,我已经能够发现所有的子类都要做相同的事情(计算利息),没有必要把这种情况留给子类去处理了,这时我们把这些方法在父类中实现,子类实现之后就可以直接使用。但是还有一些方法,是只有子类才能够实现的(每个银行具体的利率),这时候,我们把方法抽象,留给子类去实现。

    其实就是一句话:我们当前不知道如何去实现这个方法,即方法在当前不具备实现的条件

    另外,当一个类含有抽象方法,那这个类就是一个不完整的类,这样的类当然不能够执行具体的任务,即抽象类不能生成对象,所以含有抽象方法的类必须是抽象类,以免它生成对象。


    现在,我们来考虑另外一种情况,如果说在一个类中,所有的方法我都不知道如何去实现,每个方法都不具备实现的条件,那怎么办。按照上面我们对抽象类的理解,当方法在当前不具备实现的条件的时候,我们应该把该方法定义成抽象方法,这样这个类中的所有方法都该定义成抽象方法,这时候,这个纯抽象类就有了一个更好听的名字,叫做接口。那么,既然这个类中每个方法我们都不知道该怎么去实现,那为什么我们还要写呢?重点就在这,我们虽然不知道这些方法怎么去具体的实现,但是我们知道这个类肯定会用到这个方法,比如一个Car类,虽然我们不知道Car具体用的什么发动机,不知道这个发动机里边是什么样,但是我们确定的是Car肯定需要一个发动机,这就是接口的作用:将要做的事情和怎么做分开


    如果说一个比较大的项目,多个人来开发,把项目分成几个模块,那各个模块的人都做什么呢?这里,我们就需要用接口来分配各个模块需要做什么,至于怎么做,那就可以交给每个人去实现了,因为他们有了接口,已经知道了自己要做什么。所以,接口的作用主要是提供一个方向,一个纲领,其本身并不能完成任何实际的任务,但是它却可以指引我们,告诉我们需要做什么,避免盲目的开发。

  • 相关阅读:
    team explorer everywhere 2010解决license试用到期的问题
    上海系分证书登记亲历
    Windows Server 8 IIS7中Remoting访问出现404错误的解决方法
    Eclipse中安装支持tfs(team foundation server)的插件team explorer everywhere 2010(二)
    Linq to oracle 太变态:Contains等函数要反着写:
    一个简单的powerdesigner模型(oom,pdm)分析器
    兴趣真的那么重要么?
    莫愁
    写给2013年自己的信
    .NET程序员也用JAVA:使用BlazeDS,SpringFramework,MySql,Flex构建RIA应用 part 3 :Flex及As 3代码编写
  • 原文地址:https://www.cnblogs.com/yuxiaoqi/p/2743074.html
Copyright © 2011-2022 走看看