Принцип открытости-закрытости Программные сущности (классы, модули, функции) должны быть открыты для расширения, но не для модификации. Рассмотрим простой пример ниже.
При добавлении нового Animal придётся дополнять код функции AnimalSound. Если подобная архитектура используется в реальном проекте, функцию придётся постоянно расширять, добавляя в неё новые выражения if.
Решение: У каждого класса, описывающего животного, будет собственный метод MakeSound и, к примеру, при переборе массива с животными достаточно будет вызвать метод MakeSound для каждого элемента массива.