面向對象-抽象類與接口的概念
阿新 • • 發佈:2019-05-10
port 用法 而且 leg sta 好的 author face nis 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),而接口只強調函數屬性的相似性。
抽象類是一個介於類和接口的一個概念,同時具備類和接口的部分特性,可以用來實現歸一化設計。
面向對象-抽象類與接口的概念