我将您的类和方法名称更改为真实世界的等效名称,以便更好地理解。我将其命名a
为 as Animal
、testa
as Eat
、b
asHuman
和testb
as Talk
。所以我们有:
class Animal {
public void Eat() { }
}
class Human : Animal {
public void Talk() { }
}
Animal a1 = new Human();
Human b1 = new Animal();
好的,回到你的问题。
1)你在第二行得到错误,因为每只动物都不是人类。是吗?
2)a1=new b()
根据我们新的命名约定,轮流a1 = new Human
表示Animal a1 = new Human
. 所以,这是正确的,因为人是一种动物。
3)a1.testb()
根据我们的新命名约定,转为a1.Talk()
. 嗯,a1
是动物(Animal a1
),我们不能指望动物会说话。
更多的:
认为aclass
是一组属性和行为。例如,我们有一个名为Animal
定义Eat
行为的组。另一个名为Human
扩展Animal
组的组,它也有自己的行为,名为Talk
. 正如我们所知,Human
它也有它的超群行为——Eat
例如在这个例子中——。
当我们有一个 group 的实例时Animal
,我们可以期待它吃东西。但是我们不能要求它说话。这是不可能的。另一方面,我们从 group 中选择的每个项目Human
实际上都是一个Animal
. 所以我们可以请他吃饭。
当我们有一个Human
实例时,我们可以要求他表现得像 aHuman
和Animal
太。我的意思是,我们可以要求他这样做Talk
,我们也可以要求他这样做Eat
。每个Human
都可以位于人类组和动物组中。
1)当我们说它Human b1 = new Animal();
准确地说:从组中拾取一个项目Animal
- 右侧部分 - 并将其放入Human
组 - 左侧部分 - 这是不可能的。因为有很多动物不是人类。
2)当我们说Animal a1 = new Human
:从组中拾取一个项目Human
- 右侧部分 - 并将其放入Animal
组 - 左侧部分 - 这很容易实现。
3) 当我们说a1.Talk()
时,我们期望 anAnimal
说话。我的意思是我们期望一个Animal
行为Human
是不可能的。