找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
尊貴會員無限使用任何功能尊貴會員無限下載附件認識好友、聊天,分享生活趣事
juliamega 無霹靂fatege 無碼無碼 megadobe
打瞌睡的諸天輪回海賊無雙dvdms388邊界ipit 010超淑女

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂

[繁]藥師少女的獨語22

[簡]SHAMAN KING FLOW

[繁]治癒魔法的錯誤使

[繁]不死不運23-

[超清繁中]霹靂天機貳

[繁]最強肉盾的迷宮攻
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 3434|回復: 8

[問題] (已解決)interface[複製鏈接]

ming2348381 該用戶已被刪除
發表於 2016-7-21 06:43 PM|顯示全部樓層
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。
本帖最後由 ming2348381 於 2016-7-22 04:20 PM 編輯

各位好,有一個例子如下
一個基礎類別abstract為"鳥"
下列子類別繼承鳥
老鷹 ,鴿子 ,雞

一個interface類別為"飛翔"
老鷹與鴿子 繼承 飛翔


我問題是,如果我所有繼承飛翔的類別,實做"飛翔"這個功能內容皆是相同的
那麼我就需在繼承飛翔的類別中都寫一次他的實作方法
...
瀏覽完整內容,請先 註冊登入會員

點評

chevylin0802 報告:確實有鳥類不會飛, 比如企鵝............酸~~~~~~~~~~~~  發表於 2016-7-22 06:59 AM
ming2348381 雪XD請原諒我舉的這個例子很差  發表於 2016-7-22 12:45 AM
snowflying 除了細分以外,要同時不要重寫代碼,並且不是所有鳥類都會飛,滿足這兩者算是矛盾的情況,有點困難  發表於 2016-7-21 11:18 PM
snowflying 如果直接把 Bird 設成 abstract class,實作了飛翔,還是一樣有不會飛的鳥的問題;要是沒有實作,還是得重寫代碼  發表於 2016-7-21 11:17 PM
kwj abstract class  發表於 2016-7-21 11:02 PM
snowflying 誰說雞不會飛,見過從 1 樓飛到三樓的  發表於 2016-7-21 10:39 PM
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。

使用道具檢舉

Rank: 2Rank: 2

帖子
508
積分
593 點
潛水值
31815 米
發表於 2016-7-21 09:06 PM|顯示全部樓層
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。
如果確定你要寫的目標只有鳥類的話,那你應該寫一個飛翔的class,,讓飛翔的class去繼承鳥類,而不是把飛翔定義成interface,會寫interface 是代表繼承interface的類別,可能會產生各種不同的實作方法。

補充內容 (2016-7-21 10:55 PM):
我知道語意會怪怪的,因為真實世界中,並不是只有鳥會會飛翔,這只是偷懶做法。如果真的要寫的有彈性,就要把飛翔這個類別變成會飛鳥類的屬性...
瀏覽完整內容,請先 註冊登入會員

點評

snowflying 對了,interface 可以繼承 (extends) 也可以實作 (implements),但兩者不同  發表於 2016-7-22 01:37 AM
snowflying 飛翔繼承鳥類怪怪的,飛翔並不是一種鳥類  發表於 2016-7-21 10:47 PM
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php

使用道具檢舉

  尊貴會員

Melty Snow  雪靈

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

帖子
3222
積分
24364 點
潛水值
76920 米
發表於 2016-7-21 10:49 PM|顯示全部樓層
可以考慮 Chicken override fly()
就直接 println("Hardly fly.")

不然就是兩個 class 去繼承 Bird
一個是會飛的鳥,一個是不會飛的鳥
前者繼承鳥類實作飛翔
後者直接繼承就好
Melty Snow [雪靈]
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。

使用道具檢舉

ming2348381 該用戶已被刪除
發表於 2016-7-22 01:22 AM|顯示全部樓層
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。
本帖最後由 ming2348381 於 2016-7-22 01:32 AM 編輯
snowflying 發表於 2016-7-21 10:49 PM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

可以考慮 Chicken override fly()
就直接 println("Hardly fly.")
...
瀏覽完整內容,請先 註冊登入會員
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。

使用道具檢舉

  尊貴會員

Melty Snow  雪靈

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

帖子
3222
積分
24364 點
潛水值
76920 米
發表於 2016-7-22 01:35 AM|顯示全部樓層
ming2348381 發表於 2016-7-22 01:22 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

第一個方式,我目前想到的問題是未來可能會有誤用的情況
未來接手的人或是自己時間久了自己也忘掉
可能不 ...
...
瀏覽完整內容,請先 註冊登入會員





Melty Snow [雪靈]
如果瀏覽伊莉時速度太慢或無法連接,可以使用其他分流瀏覽伊莉,www01.eyny.com(02,03)。

使用道具檢舉

Rank: 1

帖子
736
積分
48 點
潛水值
13932 米
發表於 2016-7-22 06:14 AM|顯示全部樓層
本帖最後由 sssun1986 於 2016-7-22 06:20 AM 編輯

這個部份可以看看設計模式裡有一個叫策略模式,
主要是每個類別不實作「Flyable」這個介面,
而是利用「Composition」的方式將「Flyable」納入成員。

實際上會有一個類別實作Fly,
只要Bird的子類別有相同的飛翔方式,
在建構時傳入或用Setter將實作Flyable的類別實體指定給該子類別就好。
...
瀏覽完整內容,請先 註冊登入會員
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。

使用道具檢舉

ming2348381 該用戶已被刪除
發表於 2016-7-22 04:18 PM|顯示全部樓層
sssun1986 發表於 2016-7-22 06:14 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

這個部份可以看看設計模式裡有一個叫策略模式,
主要是每個類別不實作「Flyable」這個介面,
而是利用「Com ...

...
瀏覽完整內容,請先 註冊登入會員
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php

使用道具檢舉

Rank: 4Rank: 4Rank: 4Rank: 4

帖子
7565
積分
4321 點
潛水值
34960 米
發表於 2016-7-24 12:47 AM|顯示全部樓層
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。
本帖最後由 chevylin0802 於 2016-7-24 01:13 AM 編輯
ming2348381 發表於 2016-7-22 01:22 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

第一個方式,我目前想到的問題是未來可能會有誤用的情況
未來接手的人或是自己時間久了自己也忘掉
可能不 ...
...
瀏覽完整內容,請先 註冊登入會員
系統已重置禁訪用戶到普通用戶和密碼一次
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。

使用道具檢舉

Rank: 2Rank: 2

帖子
37
積分
249 點
潛水值
6131 米
發表於 2016-8-23 08:04 PM|顯示全部樓層
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。
本帖最後由 thebestjavauser 於 2016-8-24 02:05 AM 編輯

因為 Java 的類型操作永遠在 value 和 type 層次啊(超可憐XD)
要是你用可以到達 kind 或更高層次的語言(例如 C++, Scala) 就沒有這些問題了

補個程式碼好了
  1. /* bird 繼承所有傳入的 Bases */
  2. template <typename... Bases>
  3.   class bird : public Bases...
  4.   { ... };

  5. /* 做出一個 base class */
  6. struct flyable
  7. { virtual void fly () { ... } };

  8. /* 再一個 base class */
  9. struct speakable
  10. { virtual void speak () { ... } };

  11. /* 你高興有幾個 base class 就做幾個 */
  12. struct singable
  13. {
  14.   /*
  15.    * 每種鳥叫聲不同,可能也不只鳥會唱歌,或許有其他的物種也會繼承這個 base,因此
  16.    * 不實作預設的 sing 函式,留給 derived classes 實做
  17.    */
  18.   virtual void sing () = 0;
  19. };

  20. /*
  21. * 鸚鵡會飛會說話,所以把 flyable, speakable 傳給 bird,這裡的 bird 會繼承 flyable
  22. * 和 speakable,parrot 再繼承繼承了這兩個 base 的 bird
  23. */
  24. class parrot : public bird<flyable, speakable>
  25. {
  26. public:
  27.   void fly () override { ... } // 如果有需要,你可以在此 override base 的函式
  28.   void speak () override { ... }
  29. };

  30. /* 同理,麻雀會飛會唱歌,但是不會說話,所以傳 flyable 和 singable 給 bird template class */
  31. class sparrow : public bird<flyable, singable>
  32. {
  33. public:
  34.   // 不 override fly 成員函式,使用 base class 預設的 fly
  35.   void sing () override { ... }
  36. };
複製代碼
這個是 C++ 基本的 Policy Based Design,處理的方法和傳統 OO 是不太相同的
因為 C++ 的語言特性支援 type constructor, 所以可以用更高階的方法來做

可以想成一般函數接受值(value)當作參數,並回傳另一個 value
type constructor 也是函數,只是他接受型別(type)作為參數,並回傳另一個 type

像上面的 bird 就是一個 type constructor
你傳 base classes 進去給它,它就會回傳一個繼承了這些 base classes 的型態給你

而且這同樣也是 type safe 的,因為 type 也有型態,叫做 kind (所以或許可以說是 kind safe ? XD)
像是 template <typename... Bases> 就是一個 kind
它規定 bird 能夠接受多少個參數,以及規定參數的 kind 為何
在這個範例裡 bird 可以接受無限多個參數,並且接受的參數必須是無參的

如果上面無法理解,可以對照著這個看

假設有一函數:
  int func (char c, int i ) { ... }
和一個 type 層級的函數 (也就是 type constructor):
  template <typename T, typename U> struct Func ...;

那麼 func 的型態是: int (char, int)
而 Func 的型態是: typename <typename, typename>

func 拿兩個參數,分別是 char 和 int 型態,並回傳一個 int 型態的參數
Func 也拿兩個參數,都是 typename 型態,並回傳一個 typename 型態的參數

你可以這樣呼叫 func: func ( 'A', 100 );
你可以這樣呼叫 Func: Func<char, float>;

在 value 層級的函數將函數當作參數(Java SE 8):
  void func ( Function<int, int> f ) { ... }
在 type 層級的函數將函數當作參數:
  template <template <typename> typename F> struct Func ...;

事實上 type constructor 只是 type 層級的函數的一種 (類似 constructor)
如果要泛指 type 層級的函數有一個專用的詞 "type families",不過那是 Haskell 的東西就是了

value 的型別叫做 type,type 的型別叫做 kind,再往上還有 sort, BOX......
這樣也提供了一個 type safe 的方法解決這個問題,而且私心認為比 OO 好多了 orz...
...
瀏覽完整內容,請先 註冊登入會員

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部