Классы похожи на контракты. Когда вы определяете свой Animal
класс, вы говорите что-то вроде: «Это животное, он может это сделать». Когда вы определяете Dog
, вы говорите: «Собака - это животное, он может делать все, что делает животное, но он также может делать это».
Теперь, когда вы делаете Animal a = new Dog()
, это нормально, поскольку Dog
может делать все, что делает Animal
.
Но когда вы делаете Dog g = new Animal()
, вы нарушаете свой контракт, поскольку Animal
не может сделать «это», может только Dog
.