Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

用非物件導向語言寫物件導向程式

0 views
Skip to first unread message

害羞小男生

unread,
Apr 19, 1998, 3:00:00 AM4/19/98
to

請問各位高手,用非物件導向語言寫物件導向程式有辦法
將物件導向的種種特性都表現出來嗎?
譬如封裝性、繼承性、多型性等。

還有訊息傳遞跟函示呼叫有何不同呢?
譬如當我需要某個屬性值時,只需寫個函示直接取值就好了
但是在物件導向程式設計中,則要以訊息傳遞至接受物件的method才能取值
如此不是多此一舉嗎?反正取值時會寫接收者物件,應該也不會取錯吧?

我是用lisp寫物件導向程式的
在模仿物件導向程式設計時,總會覺得要去表現物件導向的概念
反而要多做一些處理,有多此一舉的感覺
要如何才能確實表現特性又不會多此一舉呢?

--
※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: wphil.me.ntu.edu.tw

Hello

unread,
Apr 20, 1998, 3:00:00 AM4/20/98
to

害羞小男生 wrote:
> 請問各位高手,用非物件導向語言寫物件導向程式有辦法
> 將物件導向的種種特性都表現出來嗎?
> 譬如封裝性、繼承性、多型性等。

可以。

> 還有訊息傳遞跟函示呼叫有何不同呢?

可以完全相同,如C++的non-virtual member function。
可以不同,像MS-Windows window callback function一樣,用號碼作信息。
可以像java,用字串作信息。
可以像C++/Turbo PASCAL的virtual member function用虛擬函數表。
也可以自己想個辦法出來實作信息傳遞。

> 譬如當我需要某個屬性值時,只需寫個函示直接取值就好了
> 但是在物件導向程式設計中,則要以訊息傳遞至接受物件的method才能取值
> 如此不是多此一舉嗎?反正取值時會寫接收者物件,應該也不會取錯吧?

這樣不合乎封裝性。
如果有一日,物件的屬性結構變了,用信息的程式的還能如常運作。

例如寫時鐘物件,原本有一個屬性:本地時間。
但後來改成一個國際時鐘物件,用格林威治時間。
只要寫個換算的member function取代以前的get function,
用信息的程式便可以如常運作,不用修改。
但直接取用的程式便麻煩多多了。

> 我是用lisp寫物件導向程式的
> 在模仿物件導向程式設計時,總會覺得要去表現物件導向的概念
> 反而要多做一些處理,有多此一舉的感覺
> 要如何才能確實表現特性又不會多此一舉呢?

沒有辨法。

不過只有十分複雜的程式須要用物件導向。
所以用了物件導向方法只會增加少量的工作(相對整個程式),
但可以使程式更加清濋有條理。到時便不會覺得多此一舉了。

害羞小男生

unread,
Apr 20, 1998, 3:00:00 AM4/20/98
to

※ 引述《9791...@polyu.edu.hk (Hello)》之銘言:

> 害羞小男生 wrote:
> > 請問各位高手,用非物件導向語言寫物件導向程式有辦法
> > 將物件導向的種種特性都表現出來嗎?
> > 譬如封裝性、繼承性、多型性等。
> 可以。

如果可以,為什麼會有物件導向語言的出現?
用傳統語言寫就可以啦!
還是只是因為用物件導向語言對物件導向程式設計會好寫"很"多?

> > 譬如當我需要某個屬性值時,只需寫個函示直接取值就好了
> > 但是在物件導向程式設計中,則要以訊息傳遞至接受物件的method才能取值
> > 如此不是多此一舉嗎?反正取值時會寫接收者物件,應該也不會取錯吧?
> 這樣不合乎封裝性。
> 如果有一日,物件的屬性結構變了,用信息的程式的還能如常運作。
> 例如寫時鐘物件,原本有一個屬性:本地時間。
> 但後來改成一個國際時鐘物件,用格林威治時間。
> 只要寫個換算的member function取代以前的get function,
> 用信息的程式便可以如常運作,不用修改。
> 但直接取用的程式便麻煩多多了。

封裝的意義是說屬於private或protected的屬性外部類別取不到或無法更改嗎?
不然要如何做才符合封裝性呢?

如果一個取值的函數有物件名和屬性名兩個引數
屆時物件改變,只要改變物件名引數一樣可以取到正確的值
這樣看不出有比較麻煩啊?

謝謝回答!

0083

unread,
Apr 21, 1998, 3:00:00 AM4/21/98
to

【 在 wphi...@bbs.cs.nthu.edu.tw (害羞小男生) 的大作中提到: 】
: ※ 引述《9791...@polyu.edu.hk (Hello)》之銘言:
: 如果可以,為什麼會有物件導向語言的出現?
: 用傳統語言寫就可以啦!
: 還是只是因為用物件導向語言對物件導向程式設計會好寫"很"多?
是比較好寫. OOPL 的出現就是為了使 OO 的想法容易實現
: > 這樣不合乎封裝性。

: > 如果有一日,物件的屬性結構變了,用信息的程式的還能如常運作。
: > 例如寫時鐘物件,原本有一個屬性:本地時間。
: > 但後來改成一個國際時鐘物件,用格林威治時間。
: > 只要寫個換算的member function取代以前的get function,
: > 用信息的程式便可以如常運作,不用修改。
: > 但直接取用的程式便麻煩多多了。
: 封裝的意義是說屬於private或protected的屬性外部類別取不到或無法更改嗎?
: 不然要如何做才符合封裝性呢?
您的說法是指 OOPL 用來實現封裝性的方法.
封裝性的意義是

將物件的屬性(變數,資料結構)和行為(method or function)隱藏起來
使之與外部的介面隔開, 而外部只能透過介面來操作物件.

: 如果一個取值的函數有物件名和屬性名兩個引數
: 屆時物件改變,只要改變物件名引數一樣可以取到正確的值
: 這樣看不出有比較麻煩啊?
: 謝謝回答!

如果只是小程式的話, 你會嫌麻煩那是應該的, (如果用JAVA呢!?)
其實封裝的本意是要把複雜的東西藏起來, 這樣可以讓問題更容易解決,
另外一方面, 繼承的性質引發多型, 多型的背後則是靠動態連結的機制
來運作, 而封裝是達成動態連結不可或缺的重要特性.

所以, 它們不但互相影響而且都很重要.

--
[m [1;37m※ 來源:‧動物狂歡樂園 bbs.ee.ttit.edu.tw‧[FROM: pc40-18.dorm.tt] [m

Hello

unread,
Apr 21, 1998, 3:00:00 AM4/21/98
to

害羞小男生 wrote:
> ※ 引述《9791...@polyu.edu.hk (Hello)》之銘言:
> 如果可以,為什麼會有物件導向語言的出現?
> 用傳統語言寫就可以啦!
> 還是只是因為用物件導向語言對物件導向程式設計會好寫"很"多?

就是。用物件導向語言會好寫「很」多。
我試過覺得C++的OO不夠好,自己用C把OO實作出來。
結果……十分煩複。

> > 用信息的程式便可以如常運作,不用修改。
> > 但直接取用的程式便麻煩多多了。
> 封裝的意義是說屬於private或protected的屬性外部類別取不到或無法更改嗎?
> 不然要如何做才符合封裝性呢?

private和protected是什麼?
不知道。在該物件以外都不應該知道。
更極端的是連同一class的其他物件都不會知道。

> 如果一個取值的函數有物件名和屬性名兩個引數
> 屆時物件改變,只要改變物件名引數一樣可以取到正確的值
> 這樣看不出有比較麻煩啊?

如果你的程式由十多個人寫出來,
你變一個變數,幾mb的程式碼要改,
你說煩不煩?(說得好像誇張了一點)

0 new messages