我有一个基类 Base 和一个 Derived1 类,它派生自Base类,另一个派生类 Derived2 ,它来自 derived1
下面我提到了几个对象创建的例子(后面是类的多级继承)。有人可以帮助我理解那些无法创建对象的情况以及C#中无法实现的原因吗?
Base b1 = new Base() //Possible
Base b1 = new derived1() // Possible
Derived1 d1 = new Base() // Not Possible
Derived1 d1 = new Derived1() // Possible
Derived2 d2 = new Derived1() // ----
Derived1 d1 = new Derived2() // ----
Derived2 d2 = new Derived2() // Possible
Derived2 d2 = new Base() // ----
Base b1 = new Derived2() // ----
答案 0 :(得分:5)
这是一个非常简单的方法:
public class A { }
public class B : A { }
public class C : B { }
所以它就像撤消定义一样简单:
A < B < C
(我在这里使用的是大于号,因为B是A的所有内容.C是B和A的所有内容......等等。)
所以A可以支持A,B和C. B可以支持B和C. 最后C只能支持C。
有效:
A z = new A();
A y = new B();
A x = new C();
B w = new B();
B v = new C();
C u = new C();
C#不支持任何其他组合(因为Liskov's substitution principle)。
答案 1 :(得分:1)
Derived类包含有关基类的所有信息,因为继承是“is-a”关系。
我们有一个基类“Base”和派生类“Derived”
根据继承规则“Derived is-a Base”。 Base的所有属性都存在于Derived中。
Base b = new Derived(); //可以像Derived一样获得有关base的所有信息。
Dervied d = new Base(); //这是不可能的,因为base没有关于派生的信息。
答案 2 :(得分:0)
这很容易。引用(声明的变量,因此左侧)必须是较少的派生类型。右侧的实例可能更加派生。