我將您的類和方法名稱更改爲現實世界的等價物以更好地理解。我叫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的構造函數賦值給了爲什麼它不可訪問? –