1. 接口与归一化设计
1.1Java 中的接口
================= 第一部分: Java 语言中的接口很好的展现了接口的含义: IAnimal.java
- /*
- * Java 的 Interface 接口的特征:
- * 1) 是一组功能的集合, 而不是一个功能
- * 2) 接口的功能用于交互, 所有的功能都是 public, 即别的对象可操作
- * 3) 接口只定义函数, 但不涉及函数实现
- * 4) 这些功能是相关的, 都是动物相关的功能, 但光合作用就不适宜放到 IAnimal 里面了 */
- package com.oo.demo;
- public interface IAnimal {
- public void eat();
- public void run();
- public void sleep();
- public void speak();
- }
================= 第二部分: Pig.java: 猪 " 的类设计, 实现了 IAnnimal 接口
- package com.oo.demo;
- public class Pig implements IAnimal{ // 如下每个函数都需要详细实现
- public void eat(){
- System.out.println("Pig like to eat grass");
- }
- public void run(){
- System.out.println("Pig run: front legs, back legs");
- }
- public void sleep(){
- System.out.println("Pig sleep 16 hours every day");
- }
- public void speak(){
- System.out.println("Pig can not speak"); }
- }
================= 第三部分: Person2.java
- /*
- * 实现了 IAnimal 的 "人", 有几点说明一下:
- * 1) 同样都实现了 IAnimal 的接口, 但 "人" 和 "猪" 的实现不一样, 为了避免太多代码导致影响阅读, 这里的代码简化成一行, 但输出的内容不一样, 实际项目中同一接口的同一功能点, 不同的类实现完全不一样
- * 2) 这里同样是 "人" 这个类, 但和前面介绍类时给的类 "Person" 完全不一样, 这是因为同样的逻辑概念, 在不同的应用场景下, 具备的属性和功能是完全不一样的 */
- package com.oo.demo;
- public class Person2 implements IAnimal {
- public void eat(){
- System.out.println("Person like to eat meat");
- }
- public void run(){
- System.out.println("Person run: left leg, right leg");
- }
- public void sleep(){
- System.out.println("Person sleep 8 hours every dat");
- }
- public void speak(){
- System.out.println("Hellow world, I am a person");
- }
- }
================= 第四部分: Tester03.java
- package com.oo.demo;
- public class Tester03 {
- public static void main(String[] args) {
- System.out.println("===This is a person===");
- IAnimal person = new Person2();
- person.eat();
- person.run();
- person.sleep();
- person.speak();
- System.out.println("\n===This is a pig===");
- IAnimal pig = new Pig();
- pig.eat();
- pig.run();
- pig.sleep();
- pig.speak();
- }
- }
java 中的 interface
1.2 为什么要是用接口
接口提取了一类共同的函数, 可以把接口当做一个函数的集合
然后让子类去实现接口中的函数
这样做的意义在于归一化, 即只要基于同一个接口实现的类, 那么所有的这些类产生的对象在使用时, 从用法上来说都是一样的.
归一化的好处:
1. 使用者无需关心对象的类型是什么, 只需要知道这些对象都具备哪些功能就可以了, 这极大地降低了使用的使用难度
2. 归一化使得外部使用者可以不加区分的处理所有接口兼容的对象集合
1.3python 中模仿接口
- "python 中可以使用继承的方式模拟接口"
- "下面的代码看起来像接口, 但实际并没有接口的作用, 子类完全可以不去实现接口类中的方法"
- class Interface:# 定义接口 Interface 类来模仿接口的概念, python 中压根就没有 interface 关键字来定义一个接口.
- def read(self): #定接口函数 read
- pass
- def write(self): #定义接口函数 write
- pass
- class Txt(Interface): #文本, 具体实现 read 和 write
- def read(self):
- print('文本数据的读取方法')
- def write(self):
- print('文本数据的读取方法')
- class Sata(Interface): #磁盘, 具体实现 read 和 write
- def read(self):
- print('硬盘数据的读取方法')
- def write(self):
- print('硬盘数据的读取方法')
- class Process(Interface):
- def read(self):
- print('进程数据的读取方法')
- def write(self):
- print('进程数据的读取方法')
2. 抽象类
2.1 抽象类的定义
与 Java 一样, Python 也有抽象类的概念, 但需要借助模块实现.
抽象类是一个特殊类, 抽象类只能被继承, 不能被实例化, 而且子类必须实现抽象类中的方法
2.2python 中实现抽象类
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author: vita
- # 一切皆文件
- import abc #利用 abc 模块实现抽象类
- class All_file(metaclass=abc.ABCMeta):
- all_type='file'
- @abc.abstractmethod #定义抽象方法, 无需实现功能
- def read(self):
- '子类必须定义读功能'
- pass
- @abc.abstractmethod #定义抽象方法, 无需实现功能
- def write(self):
- '子类必须定义写功能'
- pass
- # class Txt(All_file):
- # pass
- #
- # t1=Txt() #报错, 子类没有定义抽象方法
- class Txt(All_file): #子类继承抽象类, 但是必须定义 read 和 write 方法
- def read(self):
- print('文本数据的读取方法')
- def write(self):
- print('文本数据的读取方法')
- class Sata(All_file): #子类继承抽象类, 但是必须定义 read 和 write 方法
- def read(self):
- print('硬盘数据的读取方法')
- def write(self):
- print('硬盘数据的读取方法')
- wenbenwenjian=Txt()
- yingpanwenjian=Sata()
- # 这样大家都是被归一化了, 也就是一切皆文件的思想
- wenbenwenjian.read()
- yingpanwenjian.write()
- print(wenbenwenjian.all_type)
- print(yingpanwenjian.all_type)
- E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
文本数据的读取方法
硬盘数据的读取方法
- file
- file
- Process finished with exit code 0
2.3 抽象类与接口
抽象类的本质还是类, 指的是一组类的相似性, 包括数据属性 (如 all_type) 和函数属性 (如 read,write), 而接口只强调函数属性的相似性.
抽象类是一个介于类和接口的一个概念, 同时具备类和接口的部分特性, 可以用来实现归一化设计.
来源: http://www.bubuko.com/infodetail-3053402.html