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 就可以把各種不同的圖形畫在螢幕上

arrow
arrow
    文章標籤
    程式語言
    全站熱搜
    創作者介紹
    創作者 jacksaleok 的頭像
    jacksaleok

    國考資訊處理工作室(高考二級資訊處理/高考三級資訊處理/調查局三等/關務人員三等/地方特考三等)

    jacksaleok 發表在 痞客邦 留言(0) 人氣()