oop物件導向,特性繼承,封裝,多型。
為什麼在這裡我要闡述這個話題,解答依然有很多。對於oop的理解的文章有很多,但是真正優質和正確的卻是寥寥無幾。認知的錯誤造成的結果就是誤用,**編寫仍然是乙個謎語一樣,許多人一直無法走出迷宮,凌亂迷惘。
oop的誕生是為了解決大型軟體專案,c 語言依然也可以完成任務,但是需要的**量讓人卻步。但是看看現在,乙個稍微大點的專案的編碼,都是非常龐大的。面向過程的編碼方式是容易的,是符合數學邏輯的。物件導向程式設計是現實場景的一種對映,乙個新的程式設計思想,但是我們習慣的數學題,並不習慣處理現實。物件導向是如何對映進入現實,從現實又如何回歸**編寫呢,這是乙個問題。
然而我們為什麼不先給出正確的oop**,來分析該如何正確編寫**,之後再去談現實的問題呢,這樣理解也許會更好。
要想編寫出好的oop**,首先**好壞不是語言問題,反而有些語言有天生的優勢(go語言)但是這並不代表你會oop,會寫好oop。
編寫**之前,有幾個原則需要說明,不是六大設計原則和23種設計模式,這本身是為了大家更好的理解oop程式設計,給大家的一種高階曲線。設計原則和設計模式本事是好意,但是現在好像讓大家深陷其中不能自拔,反而把oop的繼承,封裝,多型忘得一乾二淨。所以我還是會從繼承,封裝,多型來闡釋我將要說明的三個不准原則,為了大家編碼時候犯錯,從而思考如何更好的編碼。
三不准原則第乙個,重寫函式必須呼叫父類函式,不准覆蓋父類函式。
class person
}class student:person
}大家看到,繼承過載函式run(),在子類中先呼叫父類run方法。
這裡大家感覺不好了,不寫super也行啊,子類實現自己的函式就挺好的。對的,大家說的都對,這樣寫也是可以的,但是如果是繼承,那麼子類應該「拿來用「而不是「認個爹」,所以上邊的寫法不應該使用繼承,應該用介面。**
inte***ce runinte***ce
class person:runinte***ce
}class student:runinte***ce
}定義介面,這個很重要。下乙個要點會著重講。先說繼承,子類重寫父類方法必須呼叫父類函式。
還有子類繼承父類屬性,無論是屬性還是函式,都是繼承,就是那來要用的。覆蓋父類方法,是錯誤的使用方式。
如果需要乙個介面,那麼就去定義乙個介面。
三不准原則第二個,封裝類不准定義public介面。
這個說完大家估計會很詫異,這樣就不是封裝,是封閉了。先來看看之前的**
class dog
}class cat
}這是乙個很正常的public對外介面,沒什麼不對。是不是應該繼承乙個父類,然後過載呢。看看上面第乙個原則。
相同的介面,應該先定義介面。
inte***ce runinte***ce
class dog:runinte***ce
}class cat:runinte***ce
}這樣寫沒看見有什麼好處啊。這樣寫會涉及多型,多型呼叫的時候不再去指定類,而是指定需要實現的介面。
呼叫run介面
class controller
}在controller中呼叫的時候大家看到,我傳入不是乙個類型別,而是介面。controller只需要run起來,不管是
那個類,這樣放多型呼叫,擴充套件和降低耦合。類和類之間不存在依賴關係,只通過接**互。(面向介面程式設計)
雖然很多人知道面向介面程式設計,但是理解的不多。
還有一點,封裝處處都是,寫乙個類就是乙個封裝。而不是喊著我封裝一下,封裝不是工具。
三不准原則最後乙個,多型多介面,不准單協議。
多型有點抽象,不太好理解。我在這裡告訴大家,多型就是多個inte***ce。繼承不是多型,記住繼承不是多型。例項的class永遠不會變,只是子類例項可以指向父類class而已。
inte***ce runinte***ce
inte***ce jumpinte***ce
class dog:runinte***ce,jumpinte***ce
public func jump()
}class controller
func load(m:jumpinte***ce)
}定義兩個介面runinte***ce,jumpinte***ce,dog有兩個狀態,controller多型呼叫,呼叫的不是類,而是
呼叫某個函式,並不關心類是誰。
那為什麼不把兩個介面定義乙個inte***ce裡面呢?可以,這個場景可以,但是不建議。實際中,協議介面多種多樣,
乙個類並不需要實現那麼多的介面,定義到乙個反而混亂職責不清。還有可選實現介面,這個最好不寫,只要是介面必須實現,
不然呼叫的時候就必須判斷是否實現協議。多個協議分組,專案中也容易分的清楚,一大坨的東西大家都不會喜歡的。
OOP物件導向三大特點
一 封裝 將現實中乙個事物的屬性和功能集中定義在乙個物件中。建立物件 建立物件的3種方式 1.直接量方式 建立乙個單獨的物件 var obj 2.用new方式 var obj new object obj.屬性名 值 obj.方法名 function 3.反覆建立多個相同結構的物件的方式 2步 定義...
OOP物件導向三大特點
一 封裝 將現實中乙個事物的屬性和功能集中定義在乙個物件中。建立物件 建立物件的3種方式 1.直接量方式 建立乙個單獨的物件 var obj 2.用new方式 var obj new object obj.屬性名 值 obj.方法名 function 3.反覆建立多個相同結構的物件的方式 2步 定義...
OOP物件導向三大特點
一 封裝 將現實中乙個事物的屬性和功能集中定義在乙個物件中。建立物件 建立物件的3種方式 1.直接量方式 建立乙個單獨的物件 var obj 2.用new方式 var obj new object obj.屬性名 值 obj.方法名 function 3.反覆建立多個相同結構的物件的方式 2步 定義...