我将您的类和方法名称更改为现实世界的等价物以更好地理解。我叫a
为Animal
,testa
为Eat
,b
为Human
和testb
为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
),我们不能指望动物说话。
更多:
想想class
是一组属性和行为。例如,我们有一个名为Animal
的组定义了一个Eat
行为。另一个名为Human
的组延伸Animal
组,并且它也有自己的行为,名称为Talk
。正如我们所知,Human
也有其超群的行为 - 例如在本例中为Eat
。
当我们有一组Animal
的实例时,我们可以期待它吃东西。但我们不能要求它说话。这是不可能的。另一方面,我们从组Human
中选择的每个项目实际上都是Animal
。所以我们可以让他吃。
当我们有一个Human
实例时,我们可以要求他的行为为Human
,也可以是Animal
。我的意思是,我们可以让他去Talk
,我们也可以让他去Eat
。每个Human
可以位于人类组和动物组。
1)当我们说Human b1 = new Animal();
它说正是:从Animal
组接了一个项目 - 右边部分 - 并把它放在Human
组 - 左边 - 这是不可能的。因为有很多不是人类的动物。
2)当我们说Animal a1 = new Human
:从Human
组挑选一个项目 - 右部分 - 并将其放入Animal
组 - 左部分 - 这很容易实现。
3)当我们说a1.Talk()
时,我们预计Animal
会说话。我的意思是我们预计Animal
行动Human
行为是不可能的。
可以通过此链接帮助您。 http://msdn.microsoft.com/en-us/library/vstudio/dd460654.aspx –
您需要了解继承的概念。 b类实际上是a类的更加明确和详细的形式。因此,它具有a级所提供的所有功能,但更多。这就是你可以从b引用b的构造函数的原因。现在您需要了解a1.testb()是类b提供的额外功能,哪个类a不具备。所以,a1不能调用testb()。 –
@WasiqAli我会同意你,如果我写了1 =新的a()而不是a1 = new b()。在那种情况下,我不能访问b的方法。但是,既然我将b的构造函数赋值给了为什么它不可访问? –