Подкласс "это" класс меня смущает - PullRequest
0 голосов
/ 01 апреля 2012

Я изучаю архивирование данных и понимаю, что стандартные классы сбора обеспечивают простое архивирование, однако я хочу заархивировать NSMutableArray.Поэтому я прочитал, что, поскольку NSMutableArray "является" NSArray, потому что это подкласс, то это нормально.

Но эта идея ставит меня в тупик, и я понимаю, что это базовая концепция Objective-Cпоэтому я хочу убедиться, что я правильно понял.

Предположим, у вас есть класс "автомобиль" с подклассом "джип".Теперь, основываясь на вышесказанном, вы можете сказать следующее:

automobileInstance=jeepInstance;

... потому что джип - это подкласс автомобиля.

Но мне это кажется задом наперед,Я думаю, что вместо этого вы должны сказать, что экземпляр подкласса может быть равен его экземпляру суперкласса:

jeep = auto

Потому что в конце концов джип "является" автомобилем, но не все автомобилиджипы.

Так почему же вы можете сделать это:

NSArray*newArray=nsmutableArrayInstance;

Это та же идея, что и сказать:

automobile=jeep; в моем примере.

Ваш подкласс, возможно, добавил много новых переменных экземпляра, например, но если вы установите его равным суперклассу, эти iVars "потеряны" или, по крайней мере, суперкласс не распознает их, поэтомуне похоже, что объект действительно захватывает объект.

Идти в другую сторону, говоря, что sublass instance = superclass instance имеет смысл, поскольку все в суперклассе находится в подклассе;вы просто не получаете значения для дополнительных iVars, которые находятся в подклассе, но не в суперклассе, они могут быть установлены в ноль по умолчанию, но, по крайней мере, они существуют.

Ответы [ 3 ]

1 голос
/ 01 апреля 2012

Указатель суперкласса может указывать на объект, выделенный из подкласса, поскольку члены класса суперкласса всегда присутствуют в подклассе.

 autoMobilePointer = jeepObject; // works

С другой стороны, это не так, поскольку в подклассе есть члены, которых нет в суперклассе.

 jeepPointer = autoMobileObject; // doesn't work
1 голос
/ 01 апреля 2012

Я думаю, что проблема здесь в том, что вы путаете присваивание и равенство, и, возможно, классы и объекты тоже. Помните, что = означает присваивание, тогда как == и -isEqual являются тестами на равенство. Если B является подклассом A, то каждый B является A, точно так же, как каждый джип является автомобилем, а каждый человек является млекопитающим.

Но когда вы говорите:

automobile = jeep;

что вы делаете присваивает значение jeep переменной automobile. Вы не говорите, что каждый автомобиль в мире является джипом, вы говорите, что конкретная переменная automobile относится к конкретному экземпляру джипа. Это точно, как если бы я спросил вас:

На какой машине вы ездите?

В моей голове я ожидаю, что вы ответите информацией о какой-то машине. Можно сказать, что область памяти в моей голове, которую я зарезервировал для вашего ответа, имеет тип Automobile*, поскольку он может относиться к любой машине. Вы отвечаете:

Я вожу этот красный джип, припаркованный возле дерева.

Это может помочь выбрать более описательные имена для ваших переменных. Используйте что-то конкретное, например:

Automobile *theCarThatAndrewxDrives = jeep;

Это говорит о том, что речь идет об одной конкретной машине, а не обо всех.

1 голос
/ 01 апреля 2012

Думайте об этом так: все джипы - это автомобили.Не все автомобили джипы.Таким образом, вы можете сказать:

Automobile a = jeepInstance;// Джип - это всегда автомобиль

Но не:

Jeep j = autoInstance;// неудача - вместо этого autoInstance может быть Mazda.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...