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

    接口

    接口是一组功能的集合,但是接口中仅包含功能的名字,不包含具体的实现代码

    接口本质是一套协议标准,遵循这个标准的对象就能被调用

    接口目的就是为了提高扩展性:

    例如电脑提前指定制定一套USB接口协议,只要你遵循该协议,你的设备就可以被电脑使用,不需要关心到底是鼠标还是键盘

    # 协议:支持打开关闭,读写数据
    class USB:
        def open(self):
            pass
    
        def close(self):
            pass
    
        def read(self):
            pass
    
        def write(self):
            pass
    
    # 按USB标准制作鼠标
    class Mouse(USB):
        def open(self):
            # 打开方法
            print("鼠标开机了")
    
        def close(self):
            print("鼠标关闭了")
    
        def read(self):
            print("获取了光标位置")
    
        def write(self):  # 请忽略鼠标配置
            print("鼠标可以写入灯光颜色等数据...")
    
        # 至此,Mouse就算是一个合格的USB设备了
    
    # 按USB标准制作键盘
    class KeyBoard(USB):
        def open(self):
            # 打开方法
            print("键盘开机了")
    
        def close(self):
            print("键盘关闭了")
    
        def read(self):
            print("获取了按键字符...")
    
        def write(self):  # 请忽略鼠标配置
            print("键盘可以写入灯光颜色等数据...")
    
        # 至此,Mouse就算是一个合格的USB设备了
    
    # ..........其他符合USB接口协议的设备...........
    
    def pc(usb_device):
        usb_device.open()
        usb_device.read()
        usb_device.write()
        usb_device.close()
    
    mouse = Mouse()
    # 将鼠标传给pc
    pc(mouse)
    # 鼠标开机了
    # 获取了光标位置
    # 鼠标不支持写入数据
    # 鼠标关闭了
    
    key_board = KeyBoard()
    pc(key_board)
    # 键盘开机了
    # 获取了按键字符...
    # 键盘可以写入灯光颜色等数据...
    # 键盘关闭了
    
    # 上述过程,鼠标键盘的使用都没有改变pc 的代码(使用方式),体现了扩展性和复用性

    在上述案例中,PC的代码一旦完成,后期无论什么样的设备 只要遵循了USB接口协议,都能够被电脑所调用,接口主要是方便了对象的使用者,降低使用者的 学习难度,只要学习一套使用方法,就可以以不变应万变

    存在的问题:

    如果子类没有按照你的协议来设计,也没办法限制他,将导致代码无法运行

     

     

    抽象类

    抽象类是一个特殊的类,只能被继承,不能被实例化。

     如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类是从一堆中抽取相同的内容而来的,内容包括数据属性和函数属性。

         从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。

      从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。这一点与接口有点类似,但其实是不同的。

    import abc
    class All_file(metaclass = abc.ABCMeta):
        all_type = 'file'
        @abc.abstractmethod
        def read(self):
            '子类必须定义读功能'
            pass
    
        @abc.abstractmethod
        def write(selfs):
            '子类必须定义读功能'
            pass
    
    class Txt(All_file):
        def read(self):
            print('文本数据的读取方法')
    
        def write(self):
            print('文本数据的写入方法')
    
    class Sata(All_file):
        def read(self):
            print('硬盘数据的读取方法')
    
        def write(self):
            print('硬盘数据的写入方法')
    
    class Process(All_file):
        def read(self):
            print('进程数据的读取方法')
    
        def write(self):
            print('进程数据的写入方法')
    #文本文件
    text_file = Txt()
    #硬盘文件
    hd_file = Sata()
    #进程文件
    process_file = Process()
    text_file.read()
    text_file.write()
    hd_file.read()
    hd_file.write()
    process_file.read()
    process_file.write()

    抽象类与接口

    抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。

    抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计 

  • 相关阅读:
    Online ddl 工具之pt-online-schema-change
    【MySql】mysql 慢日志查询工具之mysqldumpslow
    赶集网mysql开发36条军规
    MySQL数据库高并发优化配置
    mysql的表分区
    mysql 如果处理货币金钱类型
    bootstrab table+表格 select可编辑完整实例
    mongoDb 给表添加+ 删除字段
    mongoDb +Java+springboot
    java+数据库+D3.js 实时查询人物关系图
  • 原文地址:https://www.cnblogs.com/AbrahamChen/p/11254836.html
Copyright © 2011-2022 走看看