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