1 - Как это называется?
Это тип полиморфизма, который называется «полиморфизм включения».Это позволяет вам создавать ограничения на тип переменной, которая может использоваться в вашем коде, но при этом обеспечивает некоторую гибкость типов.Java и C #, например, имеют обобщенные типы, которые позволяют различным типам и ссылкам использовать один и тот же код.Однако они часто сталкиваются с проблемами во время выполнения, которые в противном случае могли бы быть обнаружены статическим анализатором кода.Обычно считается менее рискованным полагаться на статический анализатор (при условии, что ваша IDE имеет хороший), чем ждать и обнаруживать, что в вашем коде есть ошибки после вашего выпуска.
2 - ИПочему это так?
В дополнение к причине, которую я привел выше, одним из наиболее распространенных применений этого является полиморфный массив.
Рассмотрим следующее:
// Both classes contain an Accelerate() function
NiceCar MyNiceCar = new NiceCar();
EvenNicerCar MyEvenNicerCar = new EvenNicerCar();
// We're forced to use these methods separately
MyNiceCar.Accelerate();
MyEvenNicerCar.Accelerate();
////////////////////////////////////////////////////////////////////////////////////////////////////
// We can make this code much smaller and less prone to copy/paste errors using polymorphism!
Car[] MyPolymorphicArray = new Car[] { new NiceCar(), new EvenNicerCar() };
foreach(c in MyPolymorphicArray) { c.Accelerate(); }
Используя этот тип синтаксиса, вы можете видеть, что я могу сделать код меньше, более управляемым, безопасным по типу, и наш статический анализатор кода будет жаловаться, если мы ошибемся, вместо того, чтобы ждать до времени выполнениявыяснить.При использовании этого типа архитектуры убедитесь, что методы, предназначенные для использования экземплярами, должны находиться либо в интерфейсе, либо в родительском классе этого объекта, чтобы избежать ошибок реализации.Кроме того, обратите внимание, что если вы сделаете это, метод Accelerate () может потребоваться записать только в родительском классе, что поможет сделать код еще меньше.