面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)

多態(tài):

多態(tài)的本質(zhì): 父類引用指向子類的對象 或者 接口類型的引用可以只想實(shí)現(xiàn)接口的類的實(shí)例

多態(tài)是一種運(yùn)行時(shí)期的行為非剃,編譯期是不知道的备绽。例如子類強(qiáng)制向下轉(zhuǎn)換父類引用,如果實(shí)際的對象不一致。這個(gè)行為在編譯期是檢查不出來的。運(yùn)行時(shí)候才會拋出強(qiáng)制轉(zhuǎn)換異常

抽象類:

抽象類無法實(shí)例化 不能 new
抽象方法有聲明 無實(shí)現(xiàn) (有無花括號)
子類繼承抽象類必須實(shí)現(xiàn)父類(抽象類)中的抽象方法

接口:

接口層級關(guān)系等同于 class
接口中所有方法都是抽象方法 abstract 關(guān)鍵字可以省略
類實(shí)現(xiàn)接口必須實(shí)現(xiàn)接口中的所有抽象方法

1 接口是核心捡需,其定義了要做的事情庵寞,包含了許多的方法逸尖,但沒有定義這些方法應(yīng)該如何做岩齿。
2 如果許多類實(shí)現(xiàn)了某個(gè)接口吃谣,那么每個(gè)都要用代碼實(shí)現(xiàn)那些方法
3 如果某一些類的實(shí)現(xiàn)有共通之處,則可以抽象出來一個(gè)抽象類关串,讓抽象類實(shí)現(xiàn)接口的公用的代碼飞蚓,而那些個(gè)性化的方法則由各個(gè)子類去實(shí)現(xiàn)。

轉(zhuǎn)載:

接口

1 因?yàn)閖ava不支持多重繼承,所以有了接口,一個(gè)類只能繼承一個(gè)父類往衷,但可以實(shí)現(xiàn)多個(gè)接口来颤,接口本身也可以繼承多個(gè)接口项阴。

2 接口里面的成員變量默認(rèn)都是public static final類型的。必須被顯示的初始化。

3 接口里面的方法默認(rèn)都是public abstract類型的。隱式聲明。

4 接口沒有構(gòu)造方法,不能被實(shí)例化一也。

5 接口不能實(shí)現(xiàn)另一個(gè)接口,但可以繼承多個(gè)接口题诵。

6 類如果實(shí)現(xiàn)了一個(gè)接口篷店,那么必須實(shí)現(xiàn)接口里面的所有抽象方法,否則類要被定義為抽象類。

抽象類

1 如果將一個(gè)類聲明為abstract,此類不能生成對象鸳谜,只能被繼承使用膝藕。

2 抽象方法必須存在于抽象類中咐扭。

3 抽象類中可以有一般的變量和一般的方法豁延。

4 子類繼承抽象類必須實(shí)現(xiàn)其中抽象方法,除非子類為抽象類乙濒。
private void print(){};此語句表示方法的空實(shí)現(xiàn)间影。
abstract void print()机蔗; 此語句表示方法的抽象卑硫,無實(shí)現(xiàn)障陶。

接口和抽象類的區(qū)別

1 接口只能包含抽象方法指黎,抽象類可以包含普通方法。
2 接口只能定義靜態(tài)常量屬性亲怠,抽象類既可以定義普通屬性,也可以定義靜態(tài)常量屬性。
3 接口不包含構(gòu)造方法损肛,抽象類里可以包含構(gòu)造方法嚷掠。

抽象類不能被實(shí)例化能犯,但不代表它不可以有構(gòu)造函數(shù),抽象類可以有構(gòu)造函數(shù)则果,備繼承類擴(kuò)充

1 接口是核心,其定義了要做的事情漩氨,包含了許多的方法西壮,但沒有定義這些方法應(yīng)該如何做。
2 如果許多類實(shí)現(xiàn)了某個(gè)接口叫惊,那么每個(gè)都要用代碼實(shí)現(xiàn)那些方法
3 如果某一些類的實(shí)現(xiàn)有共通之處款青,則可以抽象出來一個(gè)抽象類,讓抽象類實(shí)現(xiàn)接口的公用的代碼霍狰,而那些個(gè)性化的方法則由各個(gè)子類去實(shí)現(xiàn)抡草。

所以饰及,抽象類是為了簡化接口的實(shí)現(xiàn),他不僅提供了公共方法的實(shí)現(xiàn)康震,讓你可以快速開發(fā)燎含,又允許你的類完全可以自己實(shí)現(xiàn)所有的方法,不會出現(xiàn)緊耦合的問題腿短。

應(yīng)用場合很簡單了
1 優(yōu)先定義接口
2 如果有多個(gè)接口實(shí)現(xiàn)有公用的部分屏箍,則使用抽象類,然后集成它橘忱。

接口和抽象類的區(qū)別 --相信你看完不會再混淆了

我想赴魁,對于各位使用面向?qū)ο缶幊陶Z言的程序員來說,“接口”這個(gè)名詞一定不陌生钝诚,但是不知各位有沒有這樣的疑惑:接口有什么用途颖御?它和抽象類有什么區(qū)別?能不能用抽象類代替接口呢凝颇?而且潘拱,作為程序員,一定經(jīng)常聽到“面向接口編程”這個(gè)短語祈噪,那么它是什么意思泽铛?有什么思想內(nèi)涵?和面向?qū)ο缶幊淌鞘裁搓P(guān)系辑鲤?本文將一一解答這些疑問。

1.面向接口編程和面向?qū)ο缶幊淌鞘裁搓P(guān)系

首先杠茬,面向接口編程和面向?qū)ο缶幊滩⒉皇瞧郊壍脑氯欤⒉皇潜让嫦驅(qū)ο缶幊谈冗M(jìn)的一種獨(dú)立的編程思想,而是附屬于面向?qū)ο笏枷塍w系瓢喉,屬于其一部分宁赤。或者說栓票,它是面向?qū)ο缶幊腆w系中的思想精髓之一决左。

2.接口的本質(zhì)

接口,在表面上是由幾個(gè)沒有主體代碼的方法定義組成的集合體走贪,有唯一的名稱佛猛,可以被類或其他接口所實(shí)現(xiàn)(或者也可以說繼承)。它在形式上可能是如下的樣子:

interface InterfaceName
{
void Method1();
void Method2(int para1);
void Method3(string para2,string para3);
}

那么坠狡,接口的本質(zhì)是什么呢继找?或者說接口存在的意義是什么。我認(rèn)為可以從以下兩個(gè)視角考慮:

1)接口是一組規(guī)則的集合逃沿,它規(guī)定了實(shí)現(xiàn)本接口的類或接口必須擁有的一組規(guī)則婴渡。體現(xiàn)了自然界“如果你是……則必須能……”的理念幻锁。

例如,在自然界中边臼,人都能吃飯哄尔,即“如果你是人,則必須能吃飯”柠并。那么模擬到計(jì)算機(jī)程序中究飞,就應(yīng)該有一個(gè)IPerson(習(xí)慣上,接口名由“I”開頭)接口堂鲤,并有一個(gè)方法叫Eat()亿傅,然后我們規(guī)定,每一個(gè)表示“人”的類瘟栖,必須實(shí)現(xiàn)IPerson接口葵擎,這就模擬了自然界“如果你是人,則必須能吃飯”這條規(guī)則半哟。

從這里酬滤,我想各位也能看到些許面向?qū)ο笏枷氲臇|西。面向?qū)ο笏枷氲暮诵闹辉⒄牵褪悄M真實(shí)世界盯串,把真實(shí)世界中的事物抽象成類,整個(gè)程序靠各個(gè)類的實(shí)例互相通信戒良、互相協(xié)作完成系統(tǒng)功能体捏,這非常符合真實(shí)世界的運(yùn)行狀況,也是面向?qū)ο笏枷氲木琛?/p>

2)接口是在一定粒度視圖上同類事物的抽象表示糯崎。注意這里我強(qiáng)調(diào)了在一定粒度視圖上几缭,因?yàn)椤巴愂挛铩边@個(gè)概念是相對的,它因?yàn)榱6纫晥D不同而不同沃呢。

例如年栓,在我的眼里,我是一個(gè)人薄霜,和一頭豬有本質(zhì)區(qū)別某抓,我可以接受我和我同學(xué)是同類這個(gè)說法,但絕不能接受我和一頭豬是同類惰瓜。但是否副,如果在一個(gè)動物學(xué)家眼里,我和豬應(yīng)該是同類鸵熟,因?yàn)槲覀兌际莿游锔北啵梢哉J(rèn)為“人”和“豬”都實(shí)現(xiàn)了IAnimal這個(gè)接口,而他在研究動物行為時(shí),不會把我和豬分開對待痹届,而會從“動物”這個(gè)較大的粒度上研究呻待,但他會認(rèn)為我和一棵樹有本質(zhì)區(qū)別。

現(xiàn)在換了一個(gè)遺傳學(xué)家队腐,情況又不同了蚕捉,因?yàn)樯锒寄苓z傳,所以在他眼里柴淘,我不僅和豬沒區(qū)別迫淹,和一只蚊子、一個(gè)細(xì)菌为严、一顆樹敛熬、一個(gè)蘑菇乃至一個(gè)SARS病毒都沒什么區(qū)別,因?yàn)樗麜J(rèn)為我們都實(shí)現(xiàn)了IDescendable這個(gè)接口(注:descend vi. 遺傳)第股,即我們都是可遺傳的東西应民,他不會分別研究我們,而會將所有生物作為同類進(jìn)行研究夕吻,在他眼里沒有人和病毒之分诲锹,只有可遺傳的物質(zhì)和不可遺傳的物質(zhì)。但至少涉馅,我和一塊石頭還是有區(qū)別的归园。

可不幸的事情發(fā)生了,某日稚矿,地球上出現(xiàn)了一位偉大的人庸诱,他叫列寧,他在熟讀MAX盐捷、恩格斯的辯證唯物主義思想巨著后偶翅,頗有心得,于是他下了一個(gè)著名的定義:所謂物質(zhì)碉渡,就是能被意識所反映的客觀實(shí)在。至此母剥,我和一塊石頭滞诺、一絲空氣、一條成語和傳輸手機(jī)信號的電磁場已經(jīng)沒什么區(qū)別了环疼,因?yàn)樵诹袑幍难劾锵芭覀兌际强梢员灰庾R所反映的客觀實(shí)在。如果列寧是一名程序員炫隶,他會這么說:所謂物質(zhì)淋叶,就是所有同時(shí)實(shí)現(xiàn)了“IReflectabe”和“IEsse”兩個(gè)接口的類所生成的實(shí)例。(注:reflect v. 反映 esse n. 客觀實(shí)在)

也許你會覺得我上面的例子像在瞎掰伪阶,但是煞檩,這正是接口得以存在的意義处嫌。面向?qū)ο笏枷牒秃诵闹唤凶龆鄳B(tài)性,什么叫多態(tài)性斟湃?說白了就是在某個(gè)粒度視圖層面上對同類事物不加區(qū)別的對待而統(tǒng)一處理熏迹。而之所以敢這樣做,就是因?yàn)橛薪涌诘拇嬖谀O衲莻€(gè)遺傳學(xué)家注暗,他明白所有生物都實(shí)現(xiàn)了IDescendable接口,那只要是生物墓猎,一定有Descend()這個(gè)方法捆昏,于是他就可以統(tǒng)一研究,而不至于分別研究每一種生物而最終累死毙沾。

可能這里還不能給你一個(gè)關(guān)于接口本質(zhì)和作用的直觀印象骗卜。那么在后文的例子和對幾個(gè)設(shè)計(jì)模式的解析中,你將會更直觀體驗(yàn)到接口的內(nèi)涵搀军。

3.面向接口編程綜述

通過上文膨俐,我想大家對接口和接口的思想內(nèi)涵有了一個(gè)了解,那么什么是面向接口編程呢罩句?我個(gè)人的定義是:在系統(tǒng)分析和架構(gòu)中焚刺,分清層次和依賴關(guān)系,每個(gè)層次不是直接向其上層提供服務(wù)(即不是直接實(shí)例化在上層中)门烂,而是通過定義一組接口乳愉,僅向上層暴露其接口功能,上層對于下層僅僅是接口依賴屯远,而不依賴具體類蔓姚。

這樣做的好處是顯而易見的,首先對系統(tǒng)靈活性大有好處慨丐。當(dāng)下層需要改變時(shí)坡脐,只要接口及接口功能不變,則上層不用做任何修改房揭。甚至可以在不改動上層代碼時(shí)將下層整個(gè)替換掉备闲,就像我們將一個(gè)WD的60G硬盤換成一個(gè)希捷的160G的硬盤,計(jì)算機(jī)其他地方不用做任何改動捅暴,而是把原硬盤拔下來恬砂、新硬盤插上就行了,因?yàn)橛?jì)算機(jī)其他部分不依賴具體硬盤蓬痒,而只依賴一個(gè)IDE接口泻骤,只要硬盤實(shí)現(xiàn)了這個(gè)接口,就可以替換上去。從這里看狱掂,程序中的接口和現(xiàn)實(shí)中的接口極為相似演痒,所以我一直認(rèn)為,接口(interface)這個(gè)詞用的真是神似符欠!

使用接口的另一個(gè)好處就是不同部件或?qū)哟蔚拈_發(fā)人員可以并行開工嫡霞,就像造硬盤的不用等造CPU的,也不用等造顯示器的希柿,只要接口一致诊沪,設(shè)計(jì)合理,完全可以并行進(jìn)行開發(fā)曾撤,從而提高效率端姚。

本篇文章先到這里。最后我想再啰嗦一句:面向?qū)ο蟮木枋悄M現(xiàn)實(shí)挤悉,這也可以說是我這篇文章的靈魂渐裸。所以,多從現(xiàn)實(shí)中思考面向?qū)ο蟮臇|西装悲,對提高系統(tǒng)分析設(shè)計(jì)能力大有脾益昏鹃。

下篇文章,我將用一個(gè)實(shí)例來展示接口編程的基本方法诀诊。

而第三篇洞渤,我將解析經(jīng)典設(shè)計(jì)模式中的一些面向接口編程思想,并解析一下.NET分層架構(gòu)中的面向接口思想属瓣。

對本文的補(bǔ)充:

仔細(xì)看了各位的回復(fù)载迄,非常高興能和大家一起討論技術(shù)問題。感謝給出肯定的朋友抡蛙,也要感謝提出意見和質(zhì)疑的朋友护昧,這促使我更深入思考一些東西,希望能借此進(jìn)步粗截。在這里我想補(bǔ)充一些東西惋耙,以討論一些回復(fù)中比較集中的問題。

1.關(guān)于“面向接口編程”中的“接口”與具體面向?qū)ο笳Z言中“接口”兩個(gè)詞

看到有朋友提出“面向接口編程”中的“接口”二字應(yīng)該比單純編程語言中的interface范圍更大熊昌。我經(jīng)過思考怠晴,覺得很有道理。這里我寫的確實(shí)不太合理浴捆。我想,面向?qū)ο笳Z言中的“接口”是指具體的一種代碼結(jié)構(gòu)稿械,例如C#中用interface關(guān)鍵字定義的接口选泻。而“面向接口編程”中的“接口”可以說是一種從軟件架構(gòu)的角度、從一個(gè)更抽象的層面上指那種用于隱藏具體底層類和實(shí)現(xiàn)多態(tài)性的結(jié)構(gòu)部件。從這個(gè)意義上說页眯,如果定義一個(gè)抽象類梯捕,并且目的是為了實(shí)現(xiàn)多態(tài),那么我認(rèn)為把這個(gè)抽象類也稱為“接口”是合理的窝撵。但是用抽象類實(shí)現(xiàn)多態(tài)合理不合理傀顾?在下面第二條討論。

概括來說碌奉,我覺得兩個(gè)“接口”的概念既相互區(qū)別又相互聯(lián)系短曾。“面向接口編程”中的接口是一種思想層面的用于實(shí)現(xiàn)多態(tài)性赐劣、提高軟件靈活性和可維護(hù)性的架構(gòu)部件嫉拐,而具體語言中的“接口”是將這種思想中的部件具體實(shí)施到代碼里的手段。

2.關(guān)于抽象類與接口

看到回復(fù)中這是討論的比較激烈的一個(gè)問題魁兼。很抱歉我考慮不周沒有在文章中討論這個(gè)問題婉徘。我個(gè)人對這個(gè)問題的理解如下:

如果單從具體代碼來看,對這兩個(gè)概念很容易模糊咐汞,甚至覺得接口就是多余的盖呼,因?yàn)閱螐木唧w功能來看,除多重繼承外(C#化撕,Java中)几晤,抽象類似乎完全能取代接口。但是侯谁,難道接口的存在是為了實(shí)現(xiàn)多重繼承锌仅?當(dāng)然不是。我認(rèn)為墙贱,抽象類和接口的區(qū)別在于使用動機(jī)热芹。使用抽象類是為了代碼的復(fù)用,而使用接口的動機(jī)是為了實(shí)現(xiàn)多態(tài)性惨撇。所以伊脓,如果你在為某個(gè)地方該使用接口還是抽象類而猶豫不決時(shí),那么可以想想你的動機(jī)是什么魁衙。

看到有朋友對IPerson這個(gè)接口的質(zhì)疑报腔,我個(gè)人的理解是,IPerson這個(gè)接口該不該定義剖淀,關(guān)鍵看具體應(yīng)用中是怎么個(gè)情況纯蛾。如果我們的項(xiàng)目中有Women和Man,都繼承Person纵隔,而且Women和Man絕大多數(shù)方法都相同翻诉,只有一個(gè)方法DoSomethingInWC()不同(例子比較粗俗炮姨,各位見諒),那么當(dāng)然定義一個(gè)AbstractPerson抽象類比較合理碰煌,因?yàn)樗梢园哑渌蟹椒ǘ及M(jìn)去舒岸,子類只定義DoSomethingInWC(),大大減少了重復(fù)代碼量芦圾。

但是蛾派,如果我們程序中的Women和Man兩個(gè)類基本沒有共同代碼,而且有一個(gè)PersonHandle類需要實(shí)例化他們个少,并且不希望知道他們是男是女洪乍,而只需把他們當(dāng)作人看待,并實(shí)現(xiàn)多態(tài)稍算,那么定義成接口就有必要了典尾。

總而言之,接口與抽象類的區(qū)別主要在于使用的動機(jī)糊探,而不在于其本身钾埂。而一個(gè)東西該定義成抽象類還是接口,要根據(jù)具體環(huán)境的上下文決定科平。

再者褥紫,我認(rèn)為接口和抽象類的另一個(gè)區(qū)別在于,抽象類和它的子類之間應(yīng)該是一般和特殊的關(guān)系瞪慧,而接口僅僅是它的子類應(yīng)該實(shí)現(xiàn)的一組規(guī)則髓考。(當(dāng)然,有時(shí)也可能存在一般與特殊的關(guān)系弃酌,但我們使用接口的目的不在這里)如氨菇,交通工具定義成抽象類,汽車妓湘、飛機(jī)查蓉、輪船定義成子類,是可以接受的榜贴,因?yàn)槠囃阊小w機(jī)、輪船都是一種特殊的交通工具唬党。再譬如Icomparable接口鹃共,它只是說,實(shí)現(xiàn)這個(gè)接口的類必須要可以進(jìn)行比較驶拱,這是一條規(guī)則霜浴。如果Car這個(gè)類實(shí)現(xiàn)了Icomparable,只是說蓝纲,我們的Car中有一個(gè)方法可以對兩個(gè)Car的實(shí)例進(jìn)行比較坷随,可能是比哪輛車更貴房铭,也可能比哪輛車更大,這都無所謂温眉,但我們不能說“汽車是一種特殊的可以比較”,這在文法上都不通翁狐。

static :

static 屬性(成員變量) 所有對象共享這個(gè)類的 static 成員變量
可以通過類名直接訪問成員變量 也可以通過對象 推薦使用類名直接訪問

面試陷阱: 靜態(tài)方法只能去繼承它 不能去重寫它 类溢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市露懒,隨后出現(xiàn)的幾起案子闯冷,更是在濱河造成了極大的恐慌,老刑警劉巖懈词,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛇耀,死亡現(xiàn)場離奇詭異,居然都是意外死亡坎弯,警方通過查閱死者的電腦和手機(jī)纺涤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抠忘,“玉大人撩炊,你說我怎么就攤上這事∑槁觯” “怎么了拧咳?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長囚灼。 經(jīng)常有香客問我骆膝,道長,這世上最難降的妖魔是什么灶体? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任阅签,我火速辦了婚禮,結(jié)果婚禮上赃春,老公的妹妹穿的比我還像新娘愉择。我一直安慰自己,他們只是感情好织中,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布锥涕。 她就那樣靜靜地躺著,像睡著了一般狭吼。 火紅的嫁衣襯著肌膚如雪层坠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天刁笙,我揣著相機(jī)與錄音破花,去河邊找鬼谦趣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛座每,可吹牛的內(nèi)容都是我干的前鹅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼峭梳,長吁一口氣:“原來是場噩夢啊……” “哼舰绘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起葱椭,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捂寿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后孵运,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秦陋,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年治笨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驳概。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡大磺,死狀恐怖抡句,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杠愧,我是刑警寧澤待榔,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站流济,受9級特大地震影響锐锣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绳瘟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一雕憔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糖声,春花似錦斤彼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悦施,卻和暖如春并扇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抡诞。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工穷蛹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留土陪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓肴熏,卻偏偏與公主長得像鬼雀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子扮超,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容