這只是我看DDD書中一句話產生的聯想,我其實不知道來歷是什么樣的,所以大家不要當真,如果覺得有道理,別拿我當標題黨,我就知足了。
一般初入行的面向對象程序員面試的時候難免會遇到面向對象的三個基本特征之類的問題,答案自然是:封裝,繼承,多態。
怎么來的呢,以前沒細想過這事,不過今天看書的時候突然就因為一句話開始走神,就走到這上面來了:
一,封裝。既然是面向對象,自然就要有對象,對象自然包含了對象的屬性和對象的動作,例如
public class Person { public string Name { get; set; } public int Age { get; set; } public int Sex { get; set; } public void Walk() { //... } }
於是,人這個對象的動作和屬性就都在這個類里面了,於是“封裝”就出現了,就這么出現了。。。
二,繼承。一個軟件系統不可能只有一個人用,比如OA,那是公司有多少人,幾乎就會有多少人登陸,這么多人登陸,權限肯定會各有不同,再比如,警察會維持治安,學生會學習,但是警察和學生都是人,都用姓名,年齡,性別,都能走路,每個都寫一遍太累,怎么辦呢,繼承就來了。
public class Student : Person { public string Study() { return "學習"; } } public class Police : Person { public string Patrol() { return "維持治安"; } }
所以我就一直說,寫重復的代碼就是種恥辱,當然特定情況下需要妥協的除外。
再說說接口的實現,人可以走路,人可以寫字,人可以說話等燈等燈(人。。。可以關機),那這么多可以做的事都放Person里,咱做程序也不一定都需要啊,這時候就使用接口了,可以走路的就實現走路,可以關機的。。。就沒有然后了
interface IWalk { void Walk(); } public class Person:IWalk { public string Name { get; set; } public int Age { get; set; } public int Sex { get; set; } public void Walk() { //... } }
這時候基本上太多的問題解決了,不管是人多,還是多動症(多動症是騙人的,其實沒這回事兒)。
現在咱往細了再看看,比如說走路,你得抬腳,抬腳你得用力登地,先抬腳尖,可能是大腳趾還是什么什么的,彎腿啊,肌肉啊,筋啊,話說再加上血管流動血液,怎么供氧之后,大家還記得我說什么么,對,就是走路,真這么寫,像我從一句話走神走這么遠的人還能不能走的回來,真心是有壓力,那怎么辦呢,咱剛說完的封裝,咱就接着封裝吧。
public class WalkForward: IWalk { public void Walk() { //往前邁步 } }
public class Person { //大家理解個意思就好了,別挑實現方法的毛病哈 IWalk walk = new WalkForward();
public string Name { get; set; } public int Age { get; set; } public int Sex { get; set; } public void Walk() { walk.Walk(); } }
這個時候太大的問題,也就是走路太費勁影響到person可讀性的問題也解決了,然后就是走路方法的問題。
三,多態。走路本來就這么多事了,關鍵它還分向前走,向后走,向斜前方走。。。斜前方1度角,1.1度角。。。走。。。走個路還真難啊,好在有封裝,好在有了上面接口實現的情況,好在還有繼承,就像Student可以做所有Person能做的事一樣,向前走也是走,也就是說向后走也是走---似乎沒有什么因果關系,不過這不重要,重要的是可以看出來,我還可以這么用:
public class WalkBackwards: IWalk { public void Walk() { //往后。。。邁步? } }
IWalk walk = new WalkBackwards();
這就好辦多了,我想往前走,就把走的接口實現為向前走的,想后就后,走神到這,突然就感覺到這標題有些不合適了,不過咱作為標題黨一向不在意這個,老有人勸我改標題,說看了那個標題,一般都不願意看內容了,估計以后要注意了,不過這次是走神,是從這個出發點開始走的,用它也算貼切吧。