C 菜鳥之旅 黎克特制替換

2021-09-07 18:48:04 字數 2968 閱讀 2610

這是第二次學習「黎克特制替換」,因為經過了小組的討論和自己今天的研究,感覺對於這個理解更深刻了,於是在學習完之後立刻整理,希望大家可以從這篇部落格中有新的收穫。

「派生類(子類)物件能夠替換其基類(父類)物件使用」   ,而且他們的功能並不會發生變化。

但是為什麼子類就可以替換父類,而且整個程式的功能不會受到影響呢? 

原因:   當我們寫的關係滿足繼承的時候,父類中會存在非私有(非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是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍...

黎克特制替換原則

黎克特制替換原則更多的說的是子類與父類的關係的一種原則,子類必須實現父類的所有方法,所有能夠放子類的地方一定能夠放父類。但是這裡的話,我們講有的時候在我們的業務中,有的子類肯定是有個性化的特徵的,比如真槍和玩具槍,真槍能射出子彈,但是玩具槍就不能,那麼這個時候,我們或者通過抽象類,通過抽象類是我們可...