請問各位高手,用非物件導向語言寫物件導向程式有辦法
將物件導向的種種特性都表現出來嗎?
譬如封裝性、繼承性、多型性等。
還有訊息傳遞跟函示呼叫有何不同呢?
譬如當我需要某個屬性值時,只需寫個函示直接取值就好了
但是在物件導向程式設計中,則要以訊息傳遞至接受物件的method才能取值
如此不是多此一舉嗎?反正取值時會寫接收者物件,應該也不會取錯吧?
我是用lisp寫物件導向程式的
在模仿物件導向程式設計時,總會覺得要去表現物件導向的概念
反而要多做一些處理,有多此一舉的感覺
要如何才能確實表現特性又不會多此一舉呢?
--
※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: wphil.me.ntu.edu.tw
可以。
> 還有訊息傳遞跟函示呼叫有何不同呢?
可以完全相同,如C++的non-virtual member function。
可以不同,像MS-Windows window callback function一樣,用號碼作信息。
可以像java,用字串作信息。
可以像C++/Turbo PASCAL的virtual member function用虛擬函數表。
也可以自己想個辦法出來實作信息傳遞。
> 譬如當我需要某個屬性值時,只需寫個函示直接取值就好了
> 但是在物件導向程式設計中,則要以訊息傳遞至接受物件的method才能取值
> 如此不是多此一舉嗎?反正取值時會寫接收者物件,應該也不會取錯吧?
這樣不合乎封裝性。
如果有一日,物件的屬性結構變了,用信息的程式的還能如常運作。
例如寫時鐘物件,原本有一個屬性:本地時間。
但後來改成一個國際時鐘物件,用格林威治時間。
只要寫個換算的member function取代以前的get function,
用信息的程式便可以如常運作,不用修改。
但直接取用的程式便麻煩多多了。
> 我是用lisp寫物件導向程式的
> 在模仿物件導向程式設計時,總會覺得要去表現物件導向的概念
> 反而要多做一些處理,有多此一舉的感覺
> 要如何才能確實表現特性又不會多此一舉呢?
沒有辨法。
不過只有十分複雜的程式須要用物件導向。
所以用了物件導向方法只會增加少量的工作(相對整個程式),
但可以使程式更加清濋有條理。到時便不會覺得多此一舉了。
如果可以,為什麼會有物件導向語言的出現?
用傳統語言寫就可以啦!
還是只是因為用物件導向語言對物件導向程式設計會好寫"很"多?
> > 譬如當我需要某個屬性值時,只需寫個函示直接取值就好了
> > 但是在物件導向程式設計中,則要以訊息傳遞至接受物件的method才能取值
> > 如此不是多此一舉嗎?反正取值時會寫接收者物件,應該也不會取錯吧?
> 這樣不合乎封裝性。
> 如果有一日,物件的屬性結構變了,用信息的程式的還能如常運作。
> 例如寫時鐘物件,原本有一個屬性:本地時間。
> 但後來改成一個國際時鐘物件,用格林威治時間。
> 只要寫個換算的member function取代以前的get function,
> 用信息的程式便可以如常運作,不用修改。
> 但直接取用的程式便麻煩多多了。
封裝的意義是說屬於private或protected的屬性外部類別取不到或無法更改嗎?
不然要如何做才符合封裝性呢?
如果一個取值的函數有物件名和屬性名兩個引數
屆時物件改變,只要改變物件名引數一樣可以取到正確的值
這樣看不出有比較麻煩啊?
謝謝回答!
如果只是小程式的話, 你會嫌麻煩那是應該的, (如果用JAVA呢!?)
其實封裝的本意是要把複雜的東西藏起來, 這樣可以讓問題更容易解決,
另外一方面, 繼承的性質引發多型, 多型的背後則是靠動態連結的機制
來運作, 而封裝是達成動態連結不可或缺的重要特性.
所以, 它們不但互相影響而且都很重要.
--
[m [1;37m※ 來源:‧動物狂歡樂園 bbs.ee.ttit.edu.tw‧[FROM: pc40-18.dorm.tt] [m
就是。用物件導向語言會好寫「很」多。
我試過覺得C++的OO不夠好,自己用C把OO實作出來。
結果……十分煩複。
> > 用信息的程式便可以如常運作,不用修改。
> > 但直接取用的程式便麻煩多多了。
> 封裝的意義是說屬於private或protected的屬性外部類別取不到或無法更改嗎?
> 不然要如何做才符合封裝性呢?
private和protected是什麼?
不知道。在該物件以外都不應該知道。
更極端的是連同一class的其他物件都不會知道。
> 如果一個取值的函數有物件名和屬性名兩個引數
> 屆時物件改變,只要改變物件名引數一樣可以取到正確的值
> 這樣看不出有比較麻煩啊?
如果你的程式由十多個人寫出來,
你變一個變數,幾mb的程式碼要改,
你說煩不煩?(說得好像誇張了一點)