2012-04-01 2 views
0

Я изучаю данные архивирования, и понимаю, что стандартные классы коллекций обеспечивают легкую архивацию, однако я хочу архивировать NSMutableArray. Поэтому я прочитал, что с NSMutableArray «является« NSArray, потому что это подкласс, тогда это нормально.Подкласс класса «is» меня смущает

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

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

automobileInstance=jeepInstance;

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

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

JEEP = АВТОМАТ

Потому что после того, как весь джипа «является» автомобилем, но не все автомобили джипы.

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

NSArray*newArray=nsmutableArrayInstance;

Это та же идея, как говорят:

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

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

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

+1

Объектив-C не соответствует структуре предложения английского языка. –

+2

Учтите, что у вас есть место для парковки автомобилей. Джип может пойти туда, потому что Джип - это Автомобиль. Но если бы у вас было парковочное место специально для джипов, вы не могли бы просто вставить в него какой-нибудь старый случайный автомобиль, не так ли? Возможно, это не джип. Теперь подумайте, что 'Automobile * auto' объявляет место для размещения автомобилей (технически, указателей на автомобили, но eh). Место для парковки, если хотите. – cHao

ответ

1

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

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

Но нет:

Jeep J = autoInstance; // fail - autoInstance может быть Mazda, а не.

1

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

autoMobilePointer = jeepObject; // works 

Это не так, так как подкласс имеет члены, которых нет в суперклассе.

jeepPointer = autoMobileObject; // doesn't work 
+0

По существу, в вашем первом примере ваш новый указатель автоматически теряет всех членов в джипе – johnbakers

+0

, поэтому он не может получить к ним доступ через autoMobilePointer. Я уверен, что если вы нарисуете этот указатель на jeepPointer, тогда вы можете - jeepObject - это то, что вы выделили в памяти в конце концов. –

1

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

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

automobile = jeep; 

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

Какой автомобиль вы едете?

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

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

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

Automobile *theCarThatAndrewxDrives = jeep; 

Это делает очевидным, что мы говорим об одном конкретном автомобиле, а не обо всех автомобилях.

Смежные вопросы