理解を深めるために、クラスとメソッドの名前を実際の同等のものに変更します。a
as Animal
、testa
as Eat
、b
as Human
、testb
asと名付けました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
) であり、動物に話すことは期待できません。
もっと:
class
aは、属性と動作のグループであると考えてください。たとえば、動作Animal
を定義するという名前のグループがありEat
ます。Human
また、グループを拡張するという名前の別のグループと、 というAnimal
名前の独自の動作がありTalk
ます。私たちが知っているように、Human
にもそのスーパーグループの動作があります-たとえばEat
、この例では-.
group のインスタンスがある場合、Animal
それが食べることを期待できます。しかし、話をするように頼むことはできません。不可能です。一方、 group から選択したすべての項目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
ことです。