Как бросить 'Класс A' к его подклассу 'Класс B' - Objective C

Допустимый HTML только, чтобы быть в состоянии иметь значок на Вашем сайте - нет.

Имеющий "допустимый HTML" в смысле "HTML, который работает над каждым главным браузером или механизмом браузера" - да.

26
задан Community 23 May 2017 в 12:09
поделиться

4 ответа

Приведение переменных объекта в Objective-C обычно является ошибкой (есть несколько случаев, когда это правильно, но никогда в подобных случаях). Обратите внимание, что вы не приводите объект - вы приводите указатель к объекту. Затем у вас есть указатель типа ClassB * , но он по-прежнему указывает на тот же экземпляр ClassA. Указанная вещь вообще не изменилась.

Если вы действительно хотите преобразовать экземпляры ClassA в ClassB, вам нужно написать метод конструктора ClassB, который может создавать экземпляр ClassB из ClassA. Если вам действительно нужно добавить переменные экземпляра, это может быть вашим лучшим выбором.

Однако, как сказал Джейсон, часто бывает хорошей идеей сначала попробовать категорию.

26
ответ дан 28 November 2019 в 07:02
поделиться

Вы не можете просто привести суперкласс к его подклассу. На самом деле он не реализует какие-либо добавленные вами переменные / свойства или методы. Как только вы попытаетесь отправить его с помощью метода, который вы определяете в своем подклассе, вы получите исключение времени выполнения, и ваше приложение завершится. Вы можете безопасно использовать только одно направление: от более конкретного к более общему. То есть, вы можете безопасно преобразовать наш ClassB в ClassA, используя только методы и свойства ClassA, но не наоборот.

Подумайте об этом так: у вас есть Car (родительский класс) и FourDoorSedan ( подкласс). У каждой машины есть двигатель и две двери. Теперь предположим, что вы откуда-то берете машину, и это все, что вы о ней знаете. Вы говорите оператору, что это четырехдверный седан, но на самом деле это не так. Что происходит, когда оператор делает что-то вроде openBackPassengerDoor? Двери всего две !! То же самое и здесь.

Если вы просто хотите добавить немного функциональности в ClassA, посмотрите категории Objective-C, они, вероятно, то, что вам нужно, и никакого преобразования не потребуется. Однако внимательно прочтите документацию, потому что она не лишена недостатков.

19
ответ дан 28 November 2019 в 07:02
поделиться

Что происходит, когда вы вызываете один из методов своего подкласса для возвращаемого объекта?

ClassB * objB;
objB = (ClassB *)doSomethingCool(10);
[objB subClassMethod];

Obj-C довольно бесплатный и проигрывает с типами, вам даже не нужно знать тип перед рука, например. вы можете изменить все ссылки ClassB на id. Я знаю, что безопаснее знать, что у вас есть ожидаемый тип, но если ваш код правильный, это не имеет значения.

0
ответ дан 28 November 2019 в 07:02
поделиться

Если вы просто хотите добавить метод к существующим объектам, создание подклассов - неправильный путь. Вы можете добавить метод к существующим классам (и их экземплярам) с помощью языковой функции под названием category .

Пример:

//"ClassA+doSomethingCool.h"
@interface ClassA (doSomethingCool)
- (ClassA *)doSomethingCool:(int)howCool;
@end


//"ClassA+doSomethingCool.m"
@implementation ClassA (doSomethingCool)
- (ClassA *)doSomethingCool:(int)howCool
{

}
@end
5
ответ дан 28 November 2019 в 07:02
поделиться