我将您的类和方法名称更改为真实世界的等效名称,以便更好地理解。我将其命名a为 as Animal、testaas Eat、basHuman和testbas 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是不可能的。