2013-06-10 2 views
-1

Я положил @property (strong,nonatomic) NSMutableArray arManagedObjectArray; в подкласс, где в родительском классе arManagedObjectArray объявлен как NSArray.Почему я могу переопределить свойство в подклассах?

Однако я могу это сделать.

Если я объявляю @property (сильный, неатомный) NSMutableArray arManagedObjectArray; в родительском классе, я получу сообщение о том, что свойство не относится к типу с объявлением?

Почему я могу делать это в подклассах, но не могу ли это сделать это родительский класс?

+1

? Есть вопрос? – Fogmeister

ответ

1

arManagedObjectArray объявлен NSMutableArray в subcalss, когда вы Acces arManagedObjectArray в подклассе, то вы получите доступ к NSMutableArray

и для доступа к суперкласс NSArray вам нужно написать этот

[super arManagedObjectArray]; 

и в супер-классе вы может получить доступ к NSArray;

Редактировать

:

По вашему вопросу

вы не можете объявить arManagedObjectArray, как NSMutableArray в одном классе, так как у вас есть это имя NSArray. Таким образом, это ошибка компиляции, потому что когда вы вызываете какой-либо метод на arManagedObjectArray, тогда компилятор определяет, какой массив вам нужен NSArray или NSMutableArray.

4

Я положил @property (сильный, неатомный) NSMutableArray arManagedObjectArray; в подклассе, где в родительском классе arManagedObjectArray объявляется NSArray.

Запомните свою 6-ю степень геометрии на секунду, здесь. Вспомните, в частности, о группах фигур. Там есть аксиома, которая теперь справедлива: «Каждый квадрат представляет собой прямоугольник, но не каждый прямоугольник является квадратом». Если вы считаете квадрат подклассом прямоугольника (что имеет смысл, потому что квадрат является более конкретным типом прямоугольника), то вы можете увидеть рассуждения, приведенные в этой версии: «Every S (ubtype) является T (ype), но не каждый T (ype) является S (ubtype).

Если вы думаете об этом в контексте этого вопроса, вы получаете: «Каждый NSMutableArray является NSArray, однако не каждый NSArray является NSMutableArray ». Следовательно, вы можете переопределять свойства суперкласса в подклассе, если тип свойства эквивалентен свойству суперкласса или его подтипу. Таким образом, переопределение NSArray над NSMutableArray всегда терпит неудачу, но повторное использование NSMutableArray над NSArray всегда преуспевает.

+0

Но я не могу переопределить свойство в реализации суперкласса. –

+0

Вы не можете объявить свойства в блоке '@ implementation' – CodaFi

+0

Я имею в виду, что я не могу переопределить свойство в расширении .m-файла –

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