假言推理是根据假言命题的逻辑性质进行的推理。分为充分条件假言推理,必要条件假言推理和充分必要条件假言推理三种。
充分条件假言推理是根据充分条件假言命题的逻辑性质进行的推理。
充分条件假言推理有两条规则:
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:否定前件,就要否定后件;否定后件,就要否定前件。