Re: [問題] Abstract 和 Interface 差別?

看板java作者 (無道德事業集團)時間15年前 (2009/05/20 02:22), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串4/4 (看更多)
補充一些abstract class與interface的東西, 就比較學術上的說法, 這兩種東西其實有點像, 但實際上是差很多的東西, 別人對這兩個東西的定義是這樣的: Interface: An Interface is a special type of class that only provides a specification (not an implementation) for its abstract members. Abstract classes: The main purpose of an abstract class is to define a common interface for its subclasses. Interface的部分Alien大說的我想已經相當明白, 它只負責定義一個規格或功能, 你的 classes可以選擇是否要"支援"這個功能, 支援了之後你可以選擇在你想要使用它的時候 使用它. 但規格制定出來, 要怎麼去實行(implements), 當然得看你選擇去實作的class, 所以 compiler才會強制你要去實作該interface制定的規格(除非你這個實作的class是 abstract的) 舉例來說, 假設我是一個物件, 我實作了兩個介面: 上班族 and 男朋友, 那我在辦公室 的時候, 就是以"上班族"這個介面做操作, 其他同事都是透過"上班族"這個介面與我溝通 , 同樣的, 回到家後, 我便會換上"男朋友"這個介面. 這樣的話, 我就不會在上班的時候 , 不小心被別人invoke到"男朋友"這個介面中的方法, 我在面對閃光時也不會被呼叫到 "上班族"這個介面的方法(成員), 但事實上我是實作這兩個介面. 這與您所提到的"多重 繼承"是有相當大的出入的... 繼承比較多應該是用在Gen-spec(generalization-specialization)的概念上, 如同Alien 大說的, 就是一種"is-a", 或"is-a-kind-of"的概念, 那至於到底是不是繼承abstract classes, 在這概念上則不重要了. 例如: BMWCar繼承Car, ToyotaCar也繼承Car, 則我們可以說, ToyotaCar "is a kind of" Car, 當然, BMWCar "is a kind of" Car, 而在現實世界中, Car可以是一種具體的物件. (誰說Car一定要有品牌= =, 鐵牛車也是Car阿!!!!!) 但假設是: 男人 繼承 人, 女人 繼承 人, 當然我們可以說 男人 is-a-kind-of 人, 但這這個例子 中要注意的是, 既然有定義男人, 女人, 那"人"本身就不可是一個具體的物件, 因為人 不是男就是女(general case), "人"這個東西不該被實體化, 因為這樣會不合理, 所以 在這個地方, 我會建議將"人"這個class設為abstract. 但"人"這個class仍然可以實作 大部分男女人都有的特性, 例如"人"都會有眼睛, 鼻子, 嘴巴等. 那至於什麼時候要用interface, 什麼時候做abstract class呢? 在這之前你可能必須要先回頭來看, Object的原意是什麼, 為什麼程式要OO? An Object is an abstraction of a set of real world things. [Shlaer et al. 1992]. 更精確的說, An object is an entity that has responsibilities. i.e., it is responsible for itself. These responsibilities define the behavior of the object [Shalloway et al. 2005] 所以回歸到源頭, 還是要先得把對物件的觀念釐清, 才能夠設計出適合的抽象化結構. note: 不是把結構弄得越抽像越好, 這樣實作的人也會把code寫得很抽象.... "適當"的抽象化, 就夠了... 獻醜了... ※ 引述《adrianshum (Alien)》之銘言: : 這些很難在三言兩語裡解說得完 : 很多是要你有一定程度和有設計的經驗才能了解. : 只抽取一些明顯的錯誤和基本的概念答一答吧 : ※ 引述《ieping (maggie)》之銘言: : : 我只知道: : : Interface: : : 1.介面 : : 2.須加static : 沒有須加 static 這事. : 你說得太含糊根本不知道你想表達什麼 : : 3.不能實做方法 : : 4.通常用在多重繼承 : interface 和多重繼承有本質上很大的差別. : 只可以說, 多重繼承其中一種常用的狀況, 能以 : interface 達成 : : 5.若類別要做interface要加上implements 介面_名稱 : : Abstract: : : 1.抽象 : : 2.抽想類別 : : 3.抽想方法 : 抽想? : 你上面列這三句也是不知道你想說啥 : : 4.可以實做 : : 問題: : : 1.以上,還有其他的嗎? : 了解他們本質上的分別, 比這些有的沒的比較來得有用 : : 2.我有看人沒有先用extends 類別_名稱 直接 再類別用implements出好多的 介面 : : 是不是這樣也可以?但不太知道代表的意思or概念? : 可以 : : 謝謝高手們~ : 以前看過某人,用了一個例子來說明 base class 和 interface 的分別. : (忘了是誰了, 請諒) : extends 一個 base class, 指的是 'is-a' 的關係 : interface 則是該物支援的介面 : 比如一部電視機, 它 是一個 (is-a) 電器. : 所以很自然, 電器是一個 class, 電視機 extends 電器 : 電視機支援 100v 電源輸入 : 100v 電源輸入是一個介面 (interface), 也很自然, 你可 : 以說 : 電視機 支援 (implements) 100v電源輸入 : 但你不會說 : 電視機 是一個 100v電源輸入 : 能感受到兩者分別, 就是了解 class 和 interface 含義的最初也是最重要一步 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.84.65.145 ※ 編輯: mc18 來自: 219.84.65.145 (05/20 02:31) ※ 編輯: mc18 來自: 219.84.65.145 (05/20 02:34)

05/20 12:29, , 1F
好文推
05/20 12:29, 1F

05/20 15:00, , 2F
推這個好的觀念講解
05/20 15:00, 2F

06/03 11:22, , 3F
好文 推
06/03 11:22, 3F
文章代碼(AID): #1A4lZ_dX (java)
文章代碼(AID): #1A4lZ_dX (java)