111年身心障礙人員三等程式語言
一、請回答下列有關物件導向程式語言的問題: (一)物件導向程式語言的特性有那些?並分別說明之。(10分) (二)以你學過的物件導向程式語言,撰寫你在(一)所描述之各別特性所對應 的程式片段。(15分) |
答:
(一)
1.資料封裝(Encapsulation):
(1)定義:
a.可以將物件區分為可被外界使用的特性及受保護的內部特性。除非是允許外部程式存取的資料,否則外部程式無法改變物件內的資料。如此就能夠達到封裝保護資料的特性。
b.封裝性使得問題變為分層負責的狀態,更符合生活上的作事原則。
(2)等級:
物件導向程式設計將物件的資料與方法至少區分為三種等級 (Java除了下列等級之外,尚有 Package 等級):
a.public(公用等級):開放給任何程式碼取用。
b.private(私用等級):只允許相同類別內的程式碼取用。
c.protected(保護等級):只允許相同類別及衍生類別的程式碼取用。
d.package(封裝等級):
(a)如果宣告類別成員 (資料成員或方法成員) 時,沒有加上任何存取修飾,則預設為 package 存取範圍,該類別成員僅限於同一個 package下的成員所使用。
(b)如果在宣告類別成員時,其存取修飾超過類別存取修飾,則類別成員的存取類別修飾受到約束,也就是以類別上的存取修飾為類別成員的存取修飾。例如:
class A {
public int data;
}
在這個程式碼中,A 類別為 package 存取範圍,而 data 宣告為 public 存取範圍,則最後 data 受到 A 類別的約束,為 package 存取範圍。
2.繼承(Inheritance):
(1)定義:
定義在上層類別 (superclass) 中的資料和程序都能讓下層類別 (subclass) 來繼承,而且下層類別也能修改或增加新的資料和程序。
(2)功能:類別的繼承可以大大增加軟體的再用性 (reusability)。
(3)種類:
a.單一繼承(Single inheritance):一個類別只可以繼承自一個父類別。
b.多重繼承(Multiple inheritance):一個類別能夠繼承多個父類別。
3.多型(Polymorphism):多模 / 同名異式
(1)定義:
a.以不同的方式處理資料,傳送訊息的物件不需要事先知道接受訊息的物件所屬類別 (基底類別產生的物件陣列儲存不同衍生類別產生的物件),而接受訊息的物件可以屬於任何一個類別。
b.物件導向程式執行時,相同的訊息可能會傳送給多個不同型別的物件,系統會依據物件所屬的型別,引發對應型別的方法,而有不同的行為。
(2)種類:
a.靜態多型(static polymorphism):
(a)特設多型(Ad-hoc polymorphism):
函式多載 (Function Overloading)、運算子多載 (Operator Overloading)、巨集多型 (Macro polymorphism)。
(b)參數化多型(Parametric polymorphism):模板 (template)。
b.動態多型(dynamic polymorphism):虛擬函數 (virtual function)。
(3)構成動態多型的條件:
a.要有繼承 (extends)。
b.一定有重寫 (override) 父類別方法。
c.父類別引用指向子類別的物件。
※參考資料:
1.http://chihyen-hsiao.blogspot.tw/2013/07/1.html
2.http://notepad.yehyeh.net/Content/CSharp/CH01/03ObjectOrient/3OOCharacter/index.php
3.第七章物件導向設計:類別與物件.pdf
4.https://zh.wikipedia.org/wiki/%E5%A4%9A%E5%9E%8B_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)
5.http://eportfolio.lib.ksu.edu.tw/~4980E016/wiki/index.php/%EF%BC%94%E3%80%82%E5%A4%9A%E5%9E%8B%EF%BC%88Polymorphism%EF%BC%89
6.http://www.catonmat.net/blog/cpp-polymorphism/
7.https://openhome.cc/Gossip/JavaEssence/PackageAndModifier.html
(二)
#include <iostream.h> class Shape { public: // 封裝 virtual void draw( ) { cout << "Shape\n";} // 虛擬函數 (virtual function) }; class Triangle:virtual public Shape { // 虛擬繼承 public: // 封裝 void draw( ) { cout << "Triangle\n";} }; class Circle:virtual public Shape { // 虛擬繼承 public: // 封裝 void draw( ) { cout << "Circle\n";} }; void main(void) { Circle ci; Triangle tr; Shape *sp[4] = {&tr, &ci}; // 使用子類別的實作來取代 for(int i = 0; i < 2; i++) sp[i]->draw( ); // 使用動態多型 } |
說明:
Shape 陣列物件指到不同的子類別,然後再呼叫 draw method 就可以把各種不同的圖形畫在螢幕上。
留言列表