這是第二次學習「黎克特制替換」,因為經過了小組的討論和自己今天的研究,感覺對於這個理解更深刻了,於是在學習完之後立刻整理,希望大家可以從這篇部落格中有新的收穫。
「派生類(子類)物件能夠替換其基類(父類)物件使用」 ,而且他們的功能並不會發生變化。
但是為什麼子類就可以替換父類,而且整個程式的功能不會受到影響呢?
原因: 當我們寫的關係滿足繼承的時候,父類中會存在非私有(非private)成員,這個時候,子類肯定是得到了父類的這些非私有成員(假設,父類的成員全部都是私有的,那麼子類沒辦法從父類繼承任何成員,(這裡有的網友也說是被繼承了,只不過是無法訪問)),既然子類繼承了父類的非私有成員,那麼父類物件也就可以在子類物件中呼叫這些非私有成員。
我們先來根據小楊老師看看他講的「黎克特制替換」的四種轉換的型別:
定義了乙個父類 person,倆個子類:分別是student ,teacher ,
int num=10;
double dou=num;
第一種:
person p =new teacher();
teacher t =(teacher) p ; //這是是強制轉換
//如果 new的是子類 ,那麼父類可以轉換為子類 這樣的是可以的
第二種:
person p =new person();
student stu=(student) p ;
//如果new的是父類,那麼在轉換子類的時候是不可以的
第三種:
person p =new teacher()
student stu=(student)p;
//結果報異常,new的雖然是子類,但是轉的卻是另外乙個子類;
//即new 的子類 和 轉換的子類不是同乙個類。
第四種:
子類轉換成父類的時候就不需要強制轉換,隱氏轉換就可以了
student stu=new student()
person p =stu;
p.show();
console.readkey();
不會出現錯誤
通過上面小楊老師的講解我們能夠很清晰的清楚,在什麼情況下我們才可以將父類替換成子類---或者說是用子類來替換父類。
下面我們再來通過乙個例子來研究一下「黎克特制替換」:
class program
}class person
public void say()
}class student : person
public void saystude()
}class seniorstudent : student
public void saysenior()
}
執行後的結果是:
然後我們在main()函式中新增一些**其他的地方不改變:
static void main(string args)
繼續執行,結果是:
而且在我輸入**的過程中,乙個細節我發現,當我輸入p.的時候,它後面的方法只有say,說明父類只可以訪問父類的方法
在經過了
person p1=new student(); 之後輸入p1.的時候後面也只顯示 say 方法。
所以這裡就滿足了黎克特制替換原則,子類的student 物件替換了父類person 物件的位置
虛方法: 使用virtual關鍵字修飾的方法,叫作虛方法(一般都是在父類當中)
下面看一段關於虛方法的**:
}class person
//這裡定義了乙個虛方法
public virtual void say()
}class student : person
public student()
public void saystude()
}} 最終結果顯示:
從上面的結果中可以看出,第二個表示式滿足黎克特制替換原則,p1.say()執行的本該是父類的方法,但是卻執行了子類的say方法
這就是子類使用override關鍵字覆蓋了父類的虛方法
上面的這種情況是在父類的方法中寫了「virtual」 同時子類中的方法也寫了 override
那麼如果父類中用 virtual修飾之後,而子類沒有重寫該方法。結果會是怎麼樣呢?
}class person
//這裡定義了乙個虛方法
public virtual void say()
}class student : person
}} 結果顯示:
所以,如果子類中找不到 override 方法,就會回到子類的父類去找是否有 virtual並執行
C 菜鳥之旅 C 類
哈哈,看到這個有沒有想起小時候一直在糾結的 先有雞還是先有蛋?們的答案也是五花八門 不過下面這位兄弟的答案對我來說很有說服力 物件是指能夠看得見,摸得著的具體的特指的事物 比如 電腦 不是物件,我的 電腦 是乙個物件 電腦是類 我的這個電腦是物件 世間萬物皆為物件,物件具有屬性和方法 屬性 物件具有...
黎克特制替換原則
黎克特制替換原則 黎克特制代換原則 liskov substitution principle lsp 物件導向設計的基本原則之一。黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。lsp是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍...
黎克特制替換原則
黎克特制替換原則更多的說的是子類與父類的關係的一種原則,子類必須實現父類的所有方法,所有能夠放子類的地方一定能夠放父類。但是這裡的話,我們講有的時候在我們的業務中,有的子類肯定是有個性化的特徵的,比如真槍和玩具槍,真槍能射出子彈,但是玩具槍就不能,那麼這個時候,我們或者通過抽象類,通過抽象類是我們可...