Если B
является подклассом из A
, его экземпляры могут использоваться везде, где могут использоваться экземпляры A
.Обратное неверно.
Вот реальный пример использования классов Apple: рассмотрим NSArray
и его подкласс NSMutableArray
.Поскольку NSMutableArray
является NSArray
, допустимо следующее присвоение:
NSArray *myArray = [[NSMutableArray alloc] init];
Однако, поскольку NSArray
не обязательно является NSMutableArray
, следующее присвоение недействительно:
NSMutableArray *myArray = [[NSArray alloc] init];
РЕДАКТИРОВАТЬ С языковой точки зрения оба назначения действительны: код собирается для компиляции и может даже выполняться, если вы держитесь подальше от B
методы, также не поддерживаемые A
, благодаря механизму диспетчеризации динамических методов Objective C. Но компилятор больше не может проверять код, содержащий переменную, и сообщать вам о других потенциальных проблемах.