假言推理:為什麼介面可以多重繼承,而類不可以
假言推理是根據假言命題的邏輯性質進行的推理。分為充分條件假言推理,必要條件假言推理和充分必要條件假言推理三種。
充分條件假言推理是根據充分條件假言命題的邏輯性質進行的推理。
充分條件假言推理有兩條規則:
n 規則1:肯定前件,就要肯定後件;否定前件,不能否定後件
n 規則2:否定後件,就要否定前件;肯定後件,不能肯定前件
必要條件假言推理是根據必要條件假言命題的邏輯性質進行的推理。
必要條件假言推理有兩條規則:
n 規則1:否定前件,就要否定後件;肯定前件,不能肯定後件。
n 規則2:肯定後件,就要肯定前件;否定後件,不能否定前件。
充分必要條件假言推理是根據充分必要條件假言命題的邏輯性質進行的推理。
充分必要條件假言推理有兩條規則:
n 規則1:肯定前件,就要肯定後件;肯定後件,就要肯定前件。
n 規則2:否定前件,就要否定後件;否定後件,就要否定前件。
現在我們稱述本次需要推論的主題:在C#中,一個類不允許從多個類繼承,但可以從多個介面繼承。為什麼類和介面在繼承的時候,有不同的待遇呢?
我們在父類中定義的成員,有哪些將來在子類定義的時候有約束呢?如果你認為是那些定義了public、private、protected、internal的方法,那你就錯了。父類對子類的定義有約束的是建構函式。
我們定義瞭如下類:Order
public class Order
{
public Order(string number)
{
}
}
然後我們定義Order的子類ShipOrder類時,首先就要滿足對父類建構函式定義的認可
public class ShipOrder : Order
{
public ShipOrder(string number)
: base(number)
{
}
}
這個規則是C#的繼承構造規則:
派生類的建構函式隱式呼叫基類的建構函式。在繼承中,所有基類建構函式先於派生類建構函式獲得呼叫,並按照這些類在類層次結構中出現的先後順序呼叫。基類物件總是在任何派生類之前構建,因此,基類建構函式先於派生類建構函式獲得執行。對基類的建構函式又是通過base的關鍵字進行顯式的呼叫。
如果有以下的兩個類:Order類和Invoice類
public class Order
{
public Order(string number)
{
}
}
public class Invoice
{
public Invoice(string number)
{
}
}
現在我試圖設計一個Credence類從這兩個類繼承,就會遇到一個困惑:我怎麼樣才可以讓這兩個類的基類安全構造呢?在以下的程式碼中,你顯然可以發現,我們無法同時指定為兩個基類的建構函式作構造,因為base的關鍵字無法指定是呼叫具體哪個類的建構函式。
public class Credence : Order, Invoice
{
public Credence(string orderNumber,string invoiceNumber)
:base(orderNumber)
{
}
}
如果你認為這還不算問題的話,我們可以假設一種更復雜的關係,我們改變下Order和Invoice的關係,程式碼如下
public class Order
{
public Order(string number)
{
}
}
public class Invoice : Order
{
public Invoice(string number)
: base(number)
{
}
}
現在,可憐的Credence遇到了更困惑的問題,他應該先構造Order類還是Invoice類呢?所以我們得到一個結論,如果基類沒有任何有參建構函式,那麼子類就不需要考慮為基類傳引數,僅需要隱式的構造父類即可。
那在C#中,有哪個資料型別可以肯定的沒有建構函式呢?答案是單一的:介面。
充分條件假言推理有兩條規則:
n 規則1:如果要構造子類,就必須先構造構造父類。
n 規則2:如果子類不需要顯式的構造父類,則父類肯定沒有有參建構函式。
必要條件假言推理是根據必要條件假言命題的邏輯性質進行的推理。
必要條件假言推理有兩條規則:
n 規則1:如果父類都沒有建構函式,子類不需要考慮父類的構造次序否定前件,就要否定後件;肯定前件,不能肯定後件。
n 規則2:肯定後件,就要肯定前件;否定後件,不能否定前件。
充分必要條件假言推理是根據充分必要條件假言命題的邏輯性質進行的推理。
充分必要條件假言推理有兩條規則:
n 規則1:肯定前件,就要肯定後件;肯定後件,就要肯定前件。
n 規則2:否定前件,就要否定後件;否定後件,就要否定前件。