哪个是C#中的有效对象?

时间:2016-02-28 06:08:31

标签: c#

我有一个基类 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() // ---- 

3 个答案:

答案 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)

这很容易。引用(声明的变量,因此左侧)必须是较少的派生类型。右侧的实例可能更加派生。