溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

面向?qū)ο?抽象類(lèi)與接口的概念

發(fā)布時(shí)間:2020-07-31 13:32:48 來(lái)源:網(wǎng)絡(luò) 閱讀:227 作者:DevOperater 欄目:編程語(yǔ)言

1.接口與歸一化設(shè)計(jì)

1.1Java中的接口

=================第一部分:Java 語(yǔ)言中的接口很好的展現(xiàn)了接口的含義: IAnimal.java
/*
* Java的Interface接口的特征:
* 1)是一組功能的集合,而不是一個(gè)功能
* 2)接口的功能用于交互,所有的功能都是public,即別的對(duì)象可操作
* 3)接口只定義函數(shù),但不涉及函數(shù)實(shí)現(xiàn)
* 4)這些功能是相關(guān)的,都是動(dòng)物相關(guān)的功能,但光合作用就不適宜放到IAnimal里面了 */

package com.oo.demo;
public interface IAnimal {
    public void eat();
    public void run(); 
    public void sleep(); 
    public void speak();
}

=================第二部分:Pig.java:豬”的類(lèi)設(shè)計(jì),實(shí)現(xiàn)了IAnnimal接口 
package com.oo.demo;
public class Pig implements IAnimal{ //如下每個(gè)函數(shù)都需要詳細(xì)實(shí)現(xiàn)
    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
/*
*實(shí)現(xiàn)了IAnimal的“人”,有幾點(diǎn)說(shuō)明一下: 
* 1)同樣都實(shí)現(xiàn)了IAnimal的接口,但“人”和“豬”的實(shí)現(xiàn)不一樣,為了避免太多代碼導(dǎo)致影響閱讀,這里的代碼簡(jiǎn)化成一行,但輸出的內(nèi)容不一樣,實(shí)際項(xiàng)目中同一接口的同一功能點(diǎn),不同的類(lèi)實(shí)現(xiàn)完全不一樣
* 2)這里同樣是“人”這個(gè)類(lèi),但和前面介紹類(lèi)時(shí)給的類(lèi)“Person”完全不一樣,這是因?yàn)橥瑯拥倪壿嫺拍?在不同的應(yīng)用場(chǎng)景下,具備的屬性和功能是完全不一樣的 */

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為什么要是用接口

接口提取了一類(lèi)共同的函數(shù),可以把接口當(dāng)做一個(gè)函數(shù)的集合
然后讓子類(lèi)去實(shí)現(xiàn)接口中的函數(shù)
這樣做的意義在于歸一化,即只要基于同一個(gè)接口實(shí)現(xiàn)的類(lèi),那么所有的這些類(lèi)產(chǎn)生的對(duì)象在使用時(shí),從用法上來(lái)說(shuō)都是一樣的。
歸一化的好處:
1.使用者無(wú)需關(guān)心對(duì)象的類(lèi)型是什么,只需要知道這些對(duì)象都具備哪些功能就可以了,這極大地降低了使用的使用難度
2.歸一化使得外部使用者可以不加區(qū)分的處理所有接口兼容的對(duì)象集合

1.3python中模仿接口

"python中可以使用繼承的方式模擬接口"
"下面的代碼看起來(lái)像接口,但實(shí)際并沒(méi)有接口的作用,子類(lèi)完全可以不去實(shí)現(xiàn)接口類(lèi)中的方法"
class Interface:#定義接口Interface類(lèi)來(lái)模仿接口的概念,python中壓根就沒(méi)有interface關(guān)鍵字來(lái)定義一個(gè)接口。
    def read(self): #定接口函數(shù)read
        pass

    def write(self): #定義接口函數(shù)write
        pass

class Txt(Interface): #文本,具體實(shí)現(xiàn)read和write
    def read(self):
        print('文本數(shù)據(jù)的讀取方法')

    def write(self):
        print('文本數(shù)據(jù)的讀取方法')

class Sata(Interface): #磁盤(pán),具體實(shí)現(xiàn)read和write
    def read(self):
        print('硬盤(pán)數(shù)據(jù)的讀取方法')

    def write(self):
        print('硬盤(pán)數(shù)據(jù)的讀取方法')

class Process(Interface):
    def read(self):
        print('進(jìn)程數(shù)據(jù)的讀取方法')

    def write(self):
        print('進(jìn)程數(shù)據(jù)的讀取方法')

2.抽象類(lèi)

2.1抽象類(lèi)的定義

與Java一樣,Python也有抽象類(lèi)的概念,但需要借助模塊實(shí)現(xiàn)。
抽象類(lèi)是一個(gè)特殊類(lèi),抽象類(lèi)只能被繼承,不能被實(shí)例化,而且子類(lèi)必須實(shí)現(xiàn)抽象類(lèi)中的方法

2.2python中實(shí)現(xiàn)抽象類(lèi)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
#一切皆文件
import abc #利用abc模塊實(shí)現(xiàn)抽象類(lèi)

class All_file(metaclass=abc.ABCMeta):
    all_type='file'
    @abc.abstractmethod #定義抽象方法,無(wú)需實(shí)現(xiàn)功能
    def read(self):
        '子類(lèi)必須定義讀功能'
        pass

    @abc.abstractmethod #定義抽象方法,無(wú)需實(shí)現(xiàn)功能
    def write(self):
        '子類(lèi)必須定義寫(xiě)功能'
        pass

# class Txt(All_file):
#     pass
#
# t1=Txt() #報(bào)錯(cuò),子類(lèi)沒(méi)有定義抽象方法

class Txt(All_file): #子類(lèi)繼承抽象類(lèi),但是必須定義read和write方法
    def read(self):
        print('文本數(shù)據(jù)的讀取方法')

    def write(self):
        print('文本數(shù)據(jù)的讀取方法')

class Sata(All_file): #子類(lèi)繼承抽象類(lèi),但是必須定義read和write方法
    def read(self):
        print('硬盤(pán)數(shù)據(jù)的讀取方法')

    def write(self):
        print('硬盤(pán)數(shù)據(jù)的讀取方法')

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
文本數(shù)據(jù)的讀取方法
硬盤(pán)數(shù)據(jù)的讀取方法
file
file

Process finished with exit code 0

2.3抽象類(lèi)與接口

抽象類(lèi)的本質(zhì)還是類(lèi),指的是一組類(lèi)的相似性,包括數(shù)據(jù)屬性(如all_type)和函數(shù)屬性(如read,write),而接口只強(qiáng)調(diào)函數(shù)屬性的相似性。
抽象類(lèi)是一個(gè)介于類(lèi)和接口的一個(gè)概念,同時(shí)具備類(lèi)和接口的部分特性,可以用來(lái)實(shí)現(xiàn)歸一化設(shè)計(jì)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI