据我所知,不允许将一个派生类强制转换为另一个派生类,因此假设ClassB
和ClassC
派生自同一ClassA
,这将不起作用:
ClassB b = new ClassB();
ClassC c = new ClassC();
c = b;
但是下面的代码可以解释为什么:
ClassA b = new ClassB();
ClassA c = new ClassC();
c = b;
有人能详细解释这里发生了什么吗?
答案 0 :(得分:2)
我将通过以下方式更改您的类型,看看它是否能让情况更加清晰:
ClassA --> Animal
ClassB --> Tiger
ClassC --> Giraffe
在这个例子中:
Tiger b = new Tiger();
Giraffe c = new Giraffe();
c = b;
c
变量必须引用类型为Giraffe
的实例。尝试为Tiger
分配引用无效,因为Tiger
不是Giraffe
。
你的下一个例子:
Animal b = new Tiger();
Animal c = new Giraffe();
c = b;
有效是因为Giraffe
和Tiger
都是Animal
,所以引用Tiger
或Giraffe
完全没问题来自必须引用Animal
请注意,此代码的NONE不会更改创建的对象的实际类型。 c
和b
只是对象的引用。当你说
c = b;
您正在做的就是更改c
引用的对象 - 它现在引用b
所做的同一对象。 c
使用指向的对象现在是孤立的(在任何地方都没有引用它)。
如果你那么
b.Name = "Sam";
您会看到该更改通过b
引用和c
引用反映出来。
答案 1 :(得分:0)
如果你设置这样的类:
class ClassA
{
public int a;
}
class ClassB : ClassA
{
public string b;
}
然后你可以这样做:
ClassA B = new ClassB();
B.a = 1;
但不是这样:
B.b = "b";
编译器抱怨ClassA不包含'b'的定义。换句话说,它只将B视为ClassA。这就是你可以从C转换为B的原因。