在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

合成 VS 繼承

合成 VS 繼承

更新時間:2020-02-09 文章作者:未知 信息來源:網絡 閱讀次數:

昨兒看到一片比較 繼承與合成 的文章,不錯,翻譯出來大家共享。
內容淺顯易懂,相信你也能從中有所收獲

BTW:翻譯的不好不要罵啊,嘿嘿。。。



合成 VS 繼承
關聯class的兩種基本途徑的對比
作者:Bill Venners
出處:http://www.artima.com/designtechniques/compoinh.html


摘要
這是我的Design Techniques的一部分,這里我分析了兩者的構成(flexibility)和執行牽連(performance implications),并且我針對兩者分別給出了指導方針。

正文
建立兩個類之間的關聯是軟件設計的眾多基本行為之一。繼承和合成是兩種基本的實現方法。盡管當你使用繼承的時候JVM可以幫你做很多事情,但是你仍然可以使用合成來達到同樣的目的。本篇將比較這兩種途徑且給出使用它們的指導方針。
首先,介紹繼承和合成的背景

關于繼承
Class Fruit {......}
Class Apple extends Fruit {......}

Apple和Fruit通過extends關聯起來,蘋果是水果的一種。Fruit是Apple的supperclass,Apple是Fruit的subclass

關于合成
class Fruit {......}

class Apple {
private Fruit fruit = new Fruit();
//......
}

這里Apple和Fruit通過合成關聯起來,因為Apple擁有一個引用Fruit對象的實例變量。Apple被稱為front-end class,Fruit被稱為 back-end class。

動態綁定,多態和改變
當你使用繼承來關聯兩個類的時候,你就可以利用動態綁定和多態的好處了。

動態綁定和多態最主要的好處之一是,他們可以幫助你更簡單的修改代碼,包括添加新的子類。然而這些不能包括所有你需要改變的地方


修改superclass接口
在繼承關聯中,superclasses通常被稱為“脆弱的(fragile)”,因為對superclass的一點點的改動將波及到眾多應用程序的代碼。說的更明白些,superclass最脆弱的是它的接口。如果superclass是well-designed的――良好的接口設計,OO風格的實現,那么任何supperclass的實現的改變將不會有任何影響。如果修改superclass的接口,那么將波及到任何使用該superclass的地方和其subclass。
繼承有時被成為提供“弱封裝(week encapsulation)”,因為你直接使用subclass的地方都會受superclass接口的改變的影響。從某個角度來講,繼承是讓subclass重用superclass的代碼。


選擇合成?
繼承性的關聯很難來修改superclass的接口。合成則提供了easier-to-change的途徑。
通過繼承的代碼重用
class Fruit {
//返回切割后的份數
public int peel() {
System.out.println(“Peeling is appealing”);
return 1;
}

//將上面替換掉的新方法
public Peel peel() {
return new Peel(1);//另外一個類
}
}

class Apple extends Fruit {
}

class Example1 {
public static void main(String[] args) {
Apple apple = new Apple();
int pieces = apple.peel(); //這里受到影響
}
}

Example1中通過Apple來調用繼承自Fruit的peel()方法,但是當我們需要將peel()的返回值從int修改為Peel的時候(上面紅色部分),問題出現了,由于類型的不匹配(int peel)造成Example1的代碼不能通過編譯,雖然Example1并沒有和Fruit有任何直接的關聯,但還是受到了很大影響。

通過合成的代碼重用
合成通過在Apple中保持一個Fruit對象的引用,在Apple中聲明一個新的peel方法,內部實現只是簡單的調用Fruit的peel方法。

class Fruit {
//返回切割后的份數
public int peel() {
System.out.println(“Peeling is appealing”);
return 1;
}

//需求改變后,將上面方法修改后的新接口
public Peel peel() {
return new Peel(1);//另外一個類
}
}

class Apple {
private Fruit fruit = new Fruit();

public int peel() {
return fruit.peel();

//使用Fruit的新接口,用于取代上面一行代碼
Peel peel = fruit.peel();
return peel.getPeelCount();
}
}

class Example2 {
public static void main(String[] args) {
Apple apple = new Apple();
int pieces = apple.peel();//這里不會有任何影響
}
}

在合成實現方式中,subclass變為front-end class,superclass變為back-end class。使用繼承,subclass自動繼承了superclass的non-private方法;使用合成,front-end class必須在自身的實現中明確的調用back-end class中的相應的方法。這種直接調用有時被稱為“推進(forwarding)”或“委派(delegating)”這個方法的調用到back-end對象。

合成比繼承提供了更強壯的在代碼重用方面的封裝,因為back-end class的修改不會波及任何依賴front-end class的代碼。例如我們要將Fruit的peel方法返回值修改為Peel(上面紅色部分),同時你會看到Apple的peel方法有相應的改變,這時對Fruit接口的修改將不會影響到Example2的代碼,

比較合成與繼承
幾點對比:
back-end class(合成)比superclass(繼承)更容易修改接口。就像前面舉例說明的那樣,back-end class接口的改變必將導致front-end class實現的改變,但不會影響到front-end class的接口,所以依賴front-end class的代碼將正常工作。作為對比,superclass接口的修改不僅波及subclass層,也會影響到所有直接使用superclass接口以及使用subclass接口的地方
front-end class(合成)比subclass(繼承)更容易修改接口。正像superclass是脆弱(fragile)的,而subclass是堅硬(rigid)的。你不能只改變subclass的接口而不去確認新接口是否和父類型(supertypes)兼容。例如,你不能在subclass中添加一個與superclass方法同樣特征但返回值類型不同的新方法。合成則允許你修改front-end class的接口,而不用關心back-class。
合成允許你延遲back-end objects的創建,直到他們被需要的時候才創建,在front-end object的生命期內可以動態的改變back-end objects。對于繼承來說,一旦subclass被創建了,你就可以通過subclass object來獲取superclass的某些資源了,在subclass生命期內一直保持著superclass的對象,也就是說,subclass object一旦被創建,superclass就已知且不可改變了。
添加subclasses(繼承)比添加front-end class(合成)更容易。因為繼承伴隨多態。如果你的一些代碼僅依賴superclass,那么不用任何修改,你就能夠使用一個新的subclass。對于合成來說就不可以,除非你使用帶有接口的合成(composition with interfaces)。合成和接口的共同使用將提供一個非常強大的設計工具。
同使用subclass中從繼承superclass來的方法實現相比,合成中的直接的方法調用委派經常(often)有性能損耗。Often的意思是說,因為性能依賴眾多因素,比如JVM優化并執行程序的能力。
對于合成和繼承來說,修改任何class的實現都是簡單的。實現改變引起的連鎖反映被保留在同一個class


在合成和繼承中作出選擇
怎么作出選擇呢?這里有一個指導方針來讓我們趨向合成與繼承中的其中一個


繼承是is-a的關系
主要是說,繼承應該只被用在“subclass is-a superclass”的時候。在上面例子中,Apple is-a Fruit,所以我們傾向使用繼承。

當你認為已經有一個is-a關系的時候,你需要問自己 一個非常重要的問題,那就是這個“is-a 關系”是否在應用程序或代碼生命周期中保持不變的(constant)。舉例:當Employee在某個時間段扮演的角色是Person的時候,你可能認為 Employee is-a Person。如果Person被解雇會怎樣?如果Person即是Employee又是Supervisor會怎樣?這種暫時的is-a關系通常使用合成,而不是繼承。


不要僅僅為了得到代碼重用就使用繼承
如果你的確想重用代碼且沒有觀察到is-a關系,那么使用合成


不要僅僅為了獲取多態就使用繼承
如果你卻是想要多態,但是沒有自然的is-a關系,那么使用帶有接口的合成(composition with interfaces),這將在下個月介紹。




:

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • youjizz.com在线观看| 国产自产在线视频| 免费日韩视频在线观看| 国产精品无码电影在线观看| 肉色超薄丝袜脚交| 久久人人爽av| 污视频网址在线观看| av丝袜天堂网| 天天干天天操天天做| 中文久久久久久| 91女神在线观看| 欧洲在线免费视频| 国产欧美123| 免费毛片网站在线观看| 97在线免费视频观看| 8x8ⅹ国产精品一区二区二区| 蜜臀av.com| 国产精品久久久久久久久电影网| 992tv成人免费观看| 日本大片免费看| 免费一级特黄毛片| 欧美黄色性生活| 欧美h视频在线观看| 九色自拍视频在线观看| 日韩在线第三页| 在线观看18视频网站| 亚洲熟妇无码一区二区三区导航| 欧美极品欧美精品欧美图片| 国产视频在线视频| 久久av喷吹av高潮av| 1024av视频| 国产精品igao网网址不卡| 妺妺窝人体色www看人体| 白嫩少妇丰满一区二区| 日本高清一区二区视频| 黄色一级片播放| 一区二区三区日韩视频| 欧美性久久久久| 六月婷婷激情网| 浓精h攵女乱爱av| 搞av.com| 日韩视频在线免费播放| 黄色一级免费大片| 免费看欧美黑人毛片| 男人的天堂最新网址| 久色视频在线播放| 9色视频在线观看| 中文字幕免费高清在线| 午夜免费福利小电影| 99re8这里只有精品| 日韩肉感妇bbwbbwbbw| 日产精品久久久久久久蜜臀| 久久婷婷中文字幕| 天天爽人人爽夜夜爽| 欧美日韩一区二区在线免费观看| 日韩一级片免费视频| 国产大片一区二区三区| 亚洲精品综合在线观看| 四季av一区二区| 天天摸天天碰天天添| 成人性免费视频| 日本免费a视频| 久久亚洲国产成人精品无码区| 尤物网站在线看| 日本美女久久久| 国产又爽又黄ai换脸| 色男人天堂av| 黄色一级视频播放| www.一区二区.com| 欧妇女乱妇女乱视频| 免费看欧美黑人毛片| 久久艹国产精品| www.av毛片| 日韩在线一级片| 欧美日韩在线中文| av丝袜天堂网| 国产毛片久久久久久| 2021狠狠干| 国产无限制自拍| 91淫黄看大片| 中文字幕在线观看日| 日本xxx免费| 欧美不卡在线播放| 九九九在线观看视频| 波多野结衣国产精品| 日韩人妻精品一区二区三区| 岛国大片在线播放| 动漫av网站免费观看| 亚洲欧美自偷自拍另类| 手机在线观看日韩av| 精品无码一区二区三区在线| 国产女女做受ⅹxx高潮| aaa一级黄色片| 99久久国产综合精品五月天喷水| 亚欧无线一线二线三线区别| 国产wwwxx| 欧美高清中文字幕| 国产性生交xxxxx免费| av磁力番号网| 久久久精品在线视频| 日韩中文在线字幕| 成人黄色片视频| 日本成人在线不卡| 搡女人真爽免费午夜网站| 日韩一级片一区二区| 五月婷婷之综合激情| 久久国产精品网| 香蕉视频色在线观看| 人妻有码中文字幕| 日本福利视频在线观看| 中文字幕亚洲乱码| 无码精品a∨在线观看中文| 特级黄色片视频| 精品久久久噜噜噜噜久久图片| 久久香蕉视频网站| 看看黄色一级片| 国产精品人人爽人人爽| 亚洲不卡中文字幕无码| 精品视频在线观看一区二区| 无尽裸体动漫2d在线观看| 国产中文字幕免费观看| 男人添女荫道口图片| 欧美精品一区二区性色a+v| 在线免费视频一区| 日韩中文字幕组| www.国产区| 18禁免费无码无遮挡不卡网站| 在线观看污视频| 蜜臀av.com| 欧美与动交zoz0z| 欧美一级小视频| 中文字幕在线观看日| www.天天射.com| 波多结衣在线观看| 三级a三级三级三级a十八发禁止| 香港三级韩国三级日本三级| 男人日女人视频网站| 国产妇女馒头高清泬20p多| 欧美性潮喷xxxxx免费视频看| 粉嫩av一区二区三区天美传媒| 日韩成人av免费| 免费观看国产视频在线| 天天综合五月天| www.18av.com| 久久久久久久久久久99| 蜜桃传媒一区二区三区| 97视频在线免费播放| www.99在线| 亚洲精品免费一区亚洲精品免费精品一区| 国产高潮免费视频| 污污视频在线免费| 99在线观看视频免费| 国产亚洲精品网站| 久久精品国产露脸对白| 免费观看黄色的网站| 老子影院午夜伦不卡大全| 精品99在线视频| jizz18女人| 青青青在线观看视频| 18禁男女爽爽爽午夜网站免费| 日日噜噜夜夜狠狠| 好吊色这里只有精品| 九色在线视频观看| 亚洲天堂伊人网| 日日橹狠狠爱欧美超碰| 色网站在线视频| 欧美日韩在线中文| 无码人妻精品一区二区三区99v| 我的公把我弄高潮了视频| 国产精品一区二区小说| 欧美精品一区二区三区三州| 亚洲三级视频网站| 久久久久久www| 超碰成人在线免费观看| 国产主播在线看| 欧美一级爱爱视频| 亚洲高清在线不卡| 黄色一级二级三级| 成人中文字幕在线播放| 四虎4hu永久免费入口| 宅男噜噜噜66国产免费观看| 国产女主播av| 一级黄色大片儿| 色戒在线免费观看| 动漫av免费观看| 18禁男女爽爽爽午夜网站免费| 日韩专区第三页| 欧美少妇一级片| 孩娇小videos精品| av观看免费在线| 92看片淫黄大片一级| 少妇人妻大乳在线视频| 日韩欧美视频免费在线观看| 国产精品区在线| 潘金莲激情呻吟欲求不满视频| 成人免费毛片网| 国产精品秘入口18禁麻豆免会员| 欧美 亚洲 视频| 国产精彩视频一区二区| 亚洲熟妇无码一区二区三区导航|