• 2

哪位高人請指點物件導向的封裝、多型、抽象

買了書
也看了書
看不懂
何謂封裝、多型、抽象
能否舉例說明一下
謝謝
目前只看懂何謂繼承
2012-07-27 20:48 發佈
我不是大師,我也不敢保證我講的一定是對的,請樓主當作參考就好

封裝的話,它基本上是代表class之間的依賴性要降到最低,如此一來萬一那些程式碼被更動,就不會影響其它不相干的class。

用國王、軍官、士兵來做比喻:


國王::attack()
{
軍官->遠遠的打() ;
}

軍官::遠遠的打()
{
士兵->裝小子彈()
士兵->發射()
士兵->清槍膛()
}

以上是處於只有來福槍可以用的時代
接下來如果大砲被發明的話

國王::attack()
{
軍官->遠遠的打() ;
}

軍官::遠遠的打()
{
士兵->裝大砲彈()
士兵->發射()
士兵->清砲管()
}


所以,士兵的行為明明被改變了,卻沒有影響到國王攻擊的命令。因為國王只會跟軍官溝通,它並不會直接地命令士兵,這大概就是封裝的精神。


要深入的話,
還是要多看書。
當年侯捷的《多型與虛擬》是經典之作,
有C++底子的話,可以看看。

http://jjhou.boolan.com/jjwbooks-polymorphism-in-cpp.htm


rgly wrote:
我不是大師,我也不敢...(恕刪)

我自己看書
看了好久
認為封裝是這樣
但不知對不對

按紐是個物件
因為它已經經過封裝而成的物件
按紐可以改變一些屬性
但無法改變按紐本身的程式碼
這就是封裝的特性
不知這樣說對不對
麻煩解說
謝謝

pinget9 wrote:
按紐是個物件
因為它已經經過封裝而成的物件
按紐可以改變一些屬性
但無法改變按紐本身的程式碼


對不起,我有一點看不太懂你的意思,屬性是什麼東西?
另外,你所用的程式語言是什麼?
你又是從哪本書上學習封裝的概念呢?
因為我之前的經驗告訴我有部份的書的確寫的不太好
如果樓主想要學好程式語言的東西的話,可以參考樓上所說的,侯捷寫出來或是翻譯的書都有一定的品質

另外,寫程式的過程中一定要先確定,有那些程式碼以後是有可能改變的,有那些是以後都不會變動的,再來決定整個程式的架構

rgly wrote:
對不起,我有一點看不...(恕刪)

屬性是什麼東西?
屬性例如:
按紐的顏色
顏色就是屬性

我是學VB.net
謝謝
pinget9 wrote:
屬性是什麼東西?
屬性例如:
按紐的顏色
顏色就是屬性


看來rgly大大可能跟我一樣本身是從C或C++學的,所以對於屬性這種東西會不熟...或許換個說法會更快,就是class裡的資料成員餔。類似下面這種感覺,只是在VB.net的那些按鈕控件都已經包裝起來,所以就是所謂的按鈕.color,所以更具體而言個人認為說是屬性也沒錯。

class 按鈕
{
int color;
}
--------------------------------------------------------------------
其實封裝多型抽象沒啥難的,算是簡單的概念,要如何實踐規劃才超難的囧。這種情況你只要多寫程式,多看程式就會有感覺了。

個人認為封裝就是把一些不必要公開的過程包裝成class或是struct的感覺,關於這點其實rgly大大就講過了,在此不再贅述。
再來是多型,其實多型也算是個很簡單的概念,比如這樣好了,我想設計個函數可以幫我算出圓面積,但我有可能要丟進去的半徑是1,有可能是1.5,有可能是0.XXXXX,遇到這種情況,以往沒有多型的話,應該會做出這種下面這樣。

int GetArea_int(int radius)
float GetArea_float(float radius)

呼叫時,就會要呼叫:
GetArea_int(1);
GetArea_float(1.0f);

但有了多型就可以變成這樣:

int GetArea(int radius)
float GetArea(float radius)

呼叫時,就直接:
GetArea(1);
GetArea(1.0f);

好處就是會根據你呼叫函數時,傳入的參數來判斷你是呼叫哪個函式,這就是多型。當然傳入參數的數量也可以不一樣囉,也可以多加計算直徑呀,之類的。
--------------------------------------------------------------------
至於虛擬等到你先把以上兩個都搞定再說,不然overload和override傻傻搞不清楚就慘了,虛擬也一直是不少人反對的東西,他有時反而使的程式更複雜,前陣子在研究這兩個的時候,看到有不少人相當反對在引擎中反覆使用繼承和virtual,關於這點個人覺得見仁見智,不過個人也是覺得與其搞這些不如好好學好設計模式才是。


以上,還是國三學生的不負責任解說,錯的機率很大,有錯還請指教。

pinget9 wrote:
屬性是什麼東西?屬性...(恕刪)

個人認為封裝就是把一些不必要公開的過程包裝成class或是struct的感覺
書上也是這樣說
只是無法領會
謝謝你的解說
pinget9 wrote:
個人認為封裝就是把一...(恕刪)


總覺得你跟我有點像XD不過跟你說,當你對於理論感到不確定,就去實踐吧!從實踐中,再回頭看一看,我想你會有感覺的。封裝個人的想法中也是物件導向中的一步,除了把不需要公開的過程藏起來以外,更可以有把它包裝成一個系統的感覺,就好像一個人的手和腳,這些都是器官,最後都成為一個人的個體中的一部份,你會叫一個人去拿東西,可是你不會叫一隻手幫你拿東西,這中間的過程就是牽涉到物件,但物件其實就是在封裝概念下所提出的產物,就像你的手部都把自己該有的骨頭跟血管管理好了,你手部的神經細胞不會去跟腦部的神經細胞混在一起吧?就是類似這種感覺囉

我想多看文章,多寫小程式你就會有概念的。
可愛的卡比 wrote:
int GetArea(int radius)
float GetArea(float radius)


這東西被叫做function overloading,是多型的其中一種手法,屬於靜態連結(static-binding)
動態連結(dynamic-binding)我不確定在vb中有沒有,不過在c++中倒是很常用

多型簡單的說就是把一些明明不同的東西,卻讓它們有共通的介面。

另外,物件導向的東西我是覺的要等程式經驗多一點之後再學會比較好。不然會很難了解到書上所教的概念的用途。如果是還是學生的話,建議去找老師問會比較好,因為這些東西沒有說很好教。不用個幾百字加上程式範例是很難讓人了解的。


還有,居然有人國三就在寫程式了....,這讓我蠻意外的,想當年我第一次寫hello world是讀大一的時候。
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?