代码学习-多态

简介: 代码学习-多态

代码学习-多态


什么是多态


“指为不同数据类型的实体提供统一的接口。”这是在百度百科上面看到的内容。


通过在现实生活中的理解就是同样的一个命令,在不同的人身上体现出不同的结果,举个例子就是去上学这件事情在不同年龄段的人体现出来的就不一样,3-6岁的孩子要去幼儿园,6-12岁的孩子要去小学,13-16-就是中学,以此类推,这就是在现实生活中的多态,那么在代码中我们可以看看是什么样子的。


多态在代码中的体现


这里代码我们以大话设计模式的简单工厂为例,这里以它为例是因为入门简单好理解。而且多态的体现更加突出。

首先这里是一个运算的父类


//运算类
public class Operation{
  private double _numberA=0;
  private double _numberB=0;
  public double GetNumberA(){
  return _numberA;
  }
  public void SetNumberA(double NumberA){
  _numberA=NumberA;
  }
    public double GetNumberB(){
  return _numberB;
  }
  public void SetNumberA(double NumberB){
  _numberA=NumberB;
  }
  public double GetResult(){
    double result=0;
    return result;
  }
}

下面这两个是运算子类,他们都继承了运算父类,别切都重写的GetResult()这个方法。

//加法类
public class OperationAdd extends Operation{
  @override
  public double GetResult(){
       return super.GetNumberA()+super.GetNumberB();
  }
}
//减法类
public class OperationSub extends Operation{
  @override
  public double GetResult(){
       return super.GetNumberA()-super.GetNumberB();
  }
}

然后这是我们的简单工厂类,上面的几个都是我们正常的继承与重写这些操作,那么下面这里的工厂类就做了一个重大的变化,可以看到createOperate()这个方法返回值类型是一个运算类的类型,而且在这个方法中可以看到有一个Operation类型的引用和一个switch case的选择语句,在这个选择分支中可以看到我们这个oper引用指向了子类的对象,那么当父类的引用指向了子类的对象也就意味着现在的这个对象使用的方法将会是子类的方法。

//简单工厂类
public class OperationFactory{
  public static Operation createOperate(String operate){
    Operation oper=null;
    switch (operate){
        case "+"
          oper=new OperationAdd();
        break;
        case"-"
          oper=new OperationSub();
        break;
    }
    return oper;
  }
}

上面说到了父类在指向子类的对象时可以使用子类的方法, 那么在客户端这里就体现出来了,我们在使用createOperate()这个方法传入的参数就是"+",那么此时的oper这对象是一个加法类型的子类对象,那此时使用的GetResult()方法就是一个进行加法计算得到的结果,如果我在createOperate()这个方法中传入的是“-“,那么这个对象就是一个减法类型的子类对象。同理那么这个GetResult()这个方法就是进行减法运算的。

这就是在代码中体现出来的多态,需要的是通过父类的引用指向子类的实现,这就是设计原则中的里氏替换。这在外界看来就是一个operation类进行的同一个操作,但是操作的结果不同。

//客户端类
public class client{
  public static void main(String[] args){
    Operation oper;
    oper=OperationFactory.createOperate("+");
    oper.setNumberA(8);
    oper.setNumberB(9);
    double result= oper.GetResult();
     System.out.println(result);
  }
}

多态的重点是什么


通过上面的描述我们可以看到,有了多态我们可以应对不同的情况,而且只需要继承父类进行重写,那么对应的就是为了更好的扩充,有了多态就增加了可扩充的空间。所以多态是为了可扩充,而对应的继承是为了更好的复用。这也是面向对象三大特征体现出来的不同侧重点。

相关文章
|
数据采集 JavaScript 数据安全/隐私保护
「Python」爬虫实战-北京公交线路信息爬取(requests+bs4)
使用requests爬取北京公交线路信息,目标网址为[https://beijing.8684.cn/](https://beijing.8684.cn/)。 爬取的具体信息为公交线路名称、公交的运营范围、运行时间、参考票价、公交所属的公司以及服务热线、公交来回线路的途径站点。
2771 0
|
存储 安全 算法
AVB源码学习(一):AVB2.0工作原理及编译配置
AVB源码学习(一):AVB2.0工作原理及编译配置
1505 0
|
SQL 关系型数据库 MySQL
docker上定期备份mysql数据库
本文是博主学习docker的记录,希望对大家有所帮助。
1675 0
|
机器学习/深度学习 人工智能 算法
CV领域再创佳绩!阿里云机器学习平台 PAI 多篇论文入选 ICCV 2023
近期,阿里云机器学习平台PAI发表的多篇论文在ICCV 2023上入选。ICCV是国际计算机视觉大会是由电气和电子工程师协会每两年举办一次的研究大会。与CVPR和ECCV一起,它被认为是计算机视觉领域的顶级会议之一。ICCV 2023将于10月2日至10月6日法国巴黎举办。ICCV汇聚了来自世界各地的学者、工程师和研究人员,分享最新的计算机视觉研究成果和技术进展。会议涵盖了计算机视觉领域的各个方向,包括图像处理、模式识别、机器学习、人工智能等等。ICCV的论文发表和演讲都备受关注,是计算机视觉领域交流和合作的重要平台。
|
前端开发 JavaScript
webpack 和 babel 实用教程【前端必备】
webpack 和 babel 实用教程【前端必备】
197 0
Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_ZMCertification", referenced from:解决方法
Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_ZMCertification", referenced from:解决方法
335 0
|
SQL 机器学习/深度学习 自然语言处理
【科研新手指南2】「NLP+网安」相关顶级会议&期刊 投稿注意事项+会议等级+DDL+提交格式
【科研新手指南2】「NLP+网安」相关顶级会议&期刊 投稿注意事项+会议等级+DDL+提交格式
1150 0
|
数据安全/隐私保护
p文件如何转为m文件
如果你是MATLAB爱好者,你一定知道MATLAB P文件,但是,你是否也和许多人一样,摸不着头脑?难道你也经常遇到MATLAB P文件加密问题,难以阅读和研究吗?那么,你需要一个MATLAB P文件解密工具!
|
存储 编解码 搜索推荐
没登录网页也能个性化推荐?5分钟带你了解浏览器指纹
没登录网页也能个性化推荐?5分钟带你了解浏览器指纹
491 0