理解を深めるために、クラスとメソッドの名前を実際の同等のものに変更します。aas Animal、testaas Eat、bas Human、testbasと名付けましたTalk。したがって、次のようになります。
class Animal {
public void Eat() { }
}
class Human : Animal {
public void Talk() { }
}
Animal a1 = new Human();
Human b1 = new Animal();
OK、質問に戻ります。
1) すべての動物は人間ではないため、2 行目にエラーが発生します。それは...ですか?
2)a1=new b()私たちの新しい命名規則によれば、 はa1 = new Humanを意味しAnimal a1 = new Humanます。そうですね、人間は動物の一種だからです。
3)a1.testb()新しい命名規則に従って、 に変わりa1.Talk()ます。a1は動物 ( Animal a1) であり、動物に話すことは期待できません。
もっと:
classaは、属性と動作のグループであると考えてください。たとえば、動作Animalを定義するという名前のグループがありEatます。Humanまた、グループを拡張するという名前の別のグループと、 というAnimal名前の独自の動作がありTalkます。私たちが知っているように、Humanにもそのスーパーグループの動作があります-たとえばEat、この例では-.
group のインスタンスがある場合、Animalそれが食べることを期待できます。しかし、話をするように頼むことはできません。不可能です。一方、 group から選択したすべての項目Humanは、実際にはAnimalです。だから私たちは彼に食べるように頼むことができます.
インスタンスがある場合、彼に として振る舞い、としてHumanも振る舞うように頼むことができます。つまり、私たちは彼に頼むことができ、彼にも頼むことができます。すべては、人間のグループと動物のグループに分類できます。HumanAnimalTalkEatHuman
1)Human b1 = new Animal();正確に言うと、グループ - 右部分 - から項目をピックアップし、グループ - 左部分Animal- に入れることHumanはできません。人間以外の動物がたくさんいるからです。
2) 私たちが言うとき:グループ - 右の部分 -Animal a1 = new Humanからアイテムを拾い上げ、グループ - 左の部分 - に入れることは簡単に可能です。HumanAnimal
3) 私たちが と言うときa1.Talk()、私たちは が話すことを期待していAnimalます。Animalつまり、不可能な行動をとることを期待しているというHumanことです。