1. 程式人生 > >第5章:介面、實現和多型

第5章:介面、實現和多型

    • 介面
      • 介面是軟體資源使用者可用的一組操作
      • 介面中的內容是函式頭和方法頭,以及它們的文件
      • 設計良好的軟體系統會將介面與其實現分隔開來
    • 多型
      • 多型是在兩個或多個類的實現中使用相同的運算子號、函式名或方法。多型函式的示例是 str len 多型運算子是 + == 多型方法的示例是 add isEmpty
    • 將介面與實現隔開的好處
      • 降低了使用者的學習難度
      • 允許使用者以即插即用的方式,快速的將資源整合起來
      • 讓使用者有機會在相同資源的不同實現中做出選擇
      • 允許使用者對資源的實現做出修改,而不影響使用者程式碼
    • 開發介面
      • 包的介面
        • 包是一種無序的集合
      • 定義包介面
        • 在選擇方法名和函式名的時候,應該儘量遵從通用、習慣的用法
        • 包介面中的函式名、方法名和運算子如下:
          • isEmpty
          • len
          • str
          • for
          • in
          • +
          • ==
          • clear
          • add
          • remove
      • 指定引數和返回值
        • 對包介面進行優化,是為介面中的操作新增引數,並用考慮它們返回什麼值( 如果有返回值的話 )
        • 迭代器依賴於 iter 方法
        • 包操作及其方法

    使用者的包操作

    Bag類中的方法

    b = <class name>( optional collection> )

    __init__( self, sourceCollection = none

    b.isEmpty()

    isEmpty( self )

    len(b)

    __len__( self )

    str( b )

    __str__( self )

    item in b

    __contains___( self, item ): 如果包含了__iter__,就不需要該方法

    b1 + b2

    __add__( self, other )

    b == anyObject

    __eq__( self, other )

    b.clear()

    clear( self )

    b.add( item )

    add( self, item )

    b.remove( item )

    remove( self, item )

    • 構造方法和實現類
      • 陣列包
      • 連結串列包
    • 先驗條件、後驗條件、異常和文件
      • 文件字串
        • 3個引號括起來的字串
        • 當執行 help 函式時,python 會顯示這3個字串
      • 一個方法,如查沒有什麼可能的錯誤條件的話,文件字串只用說明方法的引數是什麼、返回值是什麼、以及方法執行了什麼樣的操作
      • 更加詳細的文件形式
        • 先驗條件 ( Precondition )
          • 是一條語句,只有該語句為真的時候,方法才能正常執行
        • 後驗條件( Postcondition )
          • 當方法執行完畢後,什麼條件會為真
        • 異常
          • 說明可能發生的異常,通常是無法滿足方法的先驗條件所致
        • 示例
          • def remove( self, item ):

                """

                Preconditon: item is in self.

                Raise: KeyError if item is not in self.

                Postcondition: item is removed from self.

                """ 

    • Python 編寫介面
      • 一些語言,如 Java 提供了編寫介面的方法。Python 沒有這樣的方法,但是可以通過提供文件並指導類的開發,從而模擬類似的功能
      • 為了建立介面,使用文件來列出每一個方法頭,並且用一條單個的 pass return 語句來結束每一個方法
      • 示例
        • #!/usr/bin/env python

          # -*- coding:utf-8 -*-

          # Author:Lijunjie

           

          """

          File: baginterface.py

          Author: Lijunjie

          """

           

          class BagInterface( object ):

              """Interface for all bag types."""

             

              #Constructor

              def __init__( self, sourceCollection = None ):

                  """Sets the initial state of self, which includes the contents

                  of sourceCollection, if it's present."""

                  pass

                 

                 

              #Accessor methods

              def isEmpty( self ):

                  """Return True if len( self ) == 0, or False otherwise."""

                  return True

                 

                 

              def __len__( self ):

                  """Returns the number of items in self."""

                  return 0

                 

                 

              def __str__( self ):

                  """Return the string representation of self."""

                  return ""

                 

                 

              def __iter__( self ):

                  """Supports iteration over a view of self."""

                  return None

                 

                 

              def __add__( self, other ):

                  """Return a new bag containing the contents of self and other"""

                  return None

                 

                 

              def __eq__( self, other ):

                  """Return True if self equals other, otherwise False."""

                  return False

                 

                 

              #Mutator methods

              def clear( self ):

                  """Makes self become empty."""

                  pass

                 

                 

              def add( self, item ):

                  """Adds item to self."""

                  pass

                 

                 

              def remove( self, item ):

                  """

                  Precondition: item is in self.

                  Raise: KeyError if item is not in self.

                  Postcondition: item is removed form self.

                  """

                  pass

     

    • 開發一個基於陣列的實現
      • 集合類的設計確定介面後,類自身的設計和實現包含兩個步驟
        • 選擇一個合適的資料結構來包含集合的項,並且確定可能需要表示集合狀態的任何其他資料。將這些資料賦值給__init__方法中的例項變數
        • 完成介面中相關方法的程式碼
      • 選擇並初始化資料結構
        • #!/usr/bin/env python

          # -*- coding:utf-8 -*-

          # Author:Lijunjie

           

          """

          File: arraybag.py

          Author: Lijunjie

          """

           

          from arrays import Array

           

          class ArrayBag( object ):

              """An array-based bag implementation."""

             

              #Class variable

              DEFAULT_CAPACTIY = 10

             

              #Constructor

              def __init__( self, sourceCollection = None ):

                  """Sets the initial state of self, which includes the contents

                  of sourceCollection, if it's present."""

                  self._items = Array( ArrayBag.DEFAULT_CAPACTIY )

                  self._size = 0

                  if sourceCollection:

                      for item in sourceCollection:

                          self.add( item ) 

      • 先完成容易完成的方法
        • 應該儘可能的在 self 上呼叫方法或函式,而不是直接使用例項變數
        • 相關推薦

          5介面實現

          介面 介面是軟體資源使用者可用的一組操作 介面中的內容是函式頭和方法頭,以及它們的文件 設計良好的軟體系統會將介面與其實現分隔開來 多型 多型是在兩個或

          5 操作架構索引檢視

          一、建立檢視: 1、語法格式: create view 檢視名 as 查詢表示式 with check option 2、新建檢視 在資源管理器中選擇檢視——>右擊新建 二、刪除和修改檢視 1、圖形化介面: alter view 檢視名 as select

          Practical Node.js (2018版) 5資料庫 使用MongoDBMongskin。

          Persistence with MongoDB and Mongoskin https://github.com/azat-co/practicalnode/blob/master/chapter5/chapter5.md 學習mongodb的官方網站: https://docs.mongodb.co

          介面繼承

          package com.java.exp10; import sun.font.EAttribute; /** * 1、類的繼承 * 繼承並不只是擴張父類的功能,還可以重寫父類的成員方法。 * 重寫,保留父類的成員方法的名稱,重寫成員方法的實現內容

          Java核心(介面繼承-繼承2)

          一、Object 類    在開始學習使用 class 關鍵字定義類時,就應用到了繼承原理,因為在 Java 中,所有的類都直接或間接繼承了 java.lang.Object 類。 Object 類是比較特殊的類,它是所有類的父類,是Java 類層中的最高層類。當建立一個類時

          Java核心(介面繼承-)

          一、多型    利用多型可以使程式具有良好的擴充套件性,並可以對所有類物件進行通用的處理。    eg :定義一個平行四邊形的類 Parallelogram ,在類中頂一個 draw() 方法。public class Parallelogram{     //例項化儲存平行

          5作為Web應用屬性監聽者/5.4 Servlet屬性的執行緒安全性請求屬性與請求分派

          上下文屬性 它不是執行緒安全的,因為它屬於應用所有,全部servlet都都可以修改它,所以在呼叫setAttribute,removeAttribute時要加鎖操作 操作方法如:,鎖要針對getServletContext物件   請求屬性

          C#基礎-5基元型別引用型別值型別

           5 本章內容:  程式語言的基元型別 引用型別和值型別 值型別的裝箱和拆箱 ·物件雜湊碼 (暫無程式碼演示) dynamic基元型別 PS:以下程式碼以裝箱和拆箱的說明居多 using System; using System.Collection

          條件循環其它語句

          tde pop 空格 fin program 比較 isspace 才有 刪除 5.1 print和import的更多使用方式 5.1.1 使用逗號輸出 print ‘Age‘,42 print 1,2,3 如果要同時輸出文本和變量值,又不希望使用字符串格式化的話

          5作為Web應用屬性監聽者/5.3 Servlet屬性引數的區別

          Servlet屬性和引數的區別 型別: 屬性: 上下文屬性 請求屬性 會話屬性 引數: 上下文引數 Sevlet初始化引數 請求引

          5作為Web應用屬性監聽者/5.2 Servlet監聽器

          監聽器介面彙總 上下文相關 初始化完成或者銷燬監聽器:ServletContextListener 新增、刪除或者替換一個屬性監聽器:ServletContextAttributeListener(屬性相關) 會話有關:

          5作為Web應用屬性監聽者/5.1 servlet的屬性

          servlet有哪些屬性 請求屬性 會話屬性 上下文屬性 單個servlet獨有配置項 在web.xml中配置: <!-- 配置 BeerSelect servlet的獨有配置項 --> <init-pa

          5座標依賴/5.2 座標詳解

          座標詳解 座標內容包括 groupid:必選 概念:通用用java包的形式表示(也就是.(點)表示法),內容一般是組織或者公司下的某個專案 例如:org.sonatype.nexus,org.sonatype 為非盈利組織

          5座標依賴/5.9 最佳實踐/5.9.2 依賴屬性使用變數

          依賴屬性使用變數 概念:用變數定義依賴的某一部分屬性,具體依賴中直接使用這個依賴即可,這樣做的好處是以後修改這個屬性時只需要修改這個變數即可 語法: 定義變數: <properties> <!—變數名--> <spring

          5座標依賴/5.9 最佳實踐/5.9.1 排除依賴

          排除依賴 概念:用於排除某個依賴,比如某個傳遞依賴版本不穩定時,用於排除這個傳遞性依賴;又比如某個傳遞性依賴存在版權問題,而不能放在中央倉庫,所以要進行排除 語法: <exclusions>   <exclusion> <grou

          易學筆記-Linux命令-5操作檔案目錄

          操作檔案和目錄 萬用字元 *:匹配任意多個字元(包括零個或者多個) [[email protected] ~]# ll -l *  列出所有檔案或者目錄,包括目錄中的子目錄或者子檔案 -rw-r--r--. 1 root root 

          易學筆記-5數字/5.10 十六進位制八進位制二進位制

          各種進製表示 二進位制開頭:0b >>> 0b1,0b1000,0b11111111  (1, 8, 255) 八進位制開頭 :0o >>> 0o10,0o20,0o30  (8, 16, 24) 十六進位制

          5函式程式碼複用

          註明:本系列課程專為全國計算機等級考試二級 Python 語言程式設計考試服務 目錄 考綱考點 知識導圖 1、函式的基本使用 函式的定義 函式的使用 2、函式的引數傳遞 可選引數傳遞 引數名稱傳遞 函式的返回值 3、變數的作用域 區域性變數 全

          5座標依賴/5.9 最佳實踐/5.9.3 依賴關係檢視

          依賴關係檢視 檢視依賴列表:mvn dependency:list 概念:查詢某個專案所有的依賴關係,平級顯示 舉例: 不區分依賴關係,全部羅列出來 [INFO]    org.springframework:spring-beans:jar:2.5.6:c

          Java本機介面規範內容 5呼叫API

          Invocation API允許軟體供應商將Java VM載入到任意本機應用程式中。 供應商可以提供支援Java的應用程式,而無需連結Java VM原始碼。 本章首先概述了Invocation API。 接下來是所有Invocation API函式的參考頁面。 它涵蓋以下主