Нет, вы не можете изменить тип класса после его создания. [1]
Лучший подход, как правило, заключается в создании метода, который клонирует. Переменная класса в этом случае обычно является сообщением объекта.
Общим примером такой формы является: [NSString stringWithString:s]
против [NSMutableString stringWithString:s];
.
Поскольку вы имеете дело с видом, часто проще просто определить внутренний тип и использовать композицию объекта. Таким образом, у вас не будет типа RedGradientButton
, но вместо него будет MyGradientButton
, который имеет (например) член characteristics
. Затем вы можете создать несколько типов характеристик (если подклассификация действительно хорошая конструкция).
[1] Вы могли, но делать не ... если кто-то говорит вам, как это может быть достигнуто. Причина: это небезопасно, и один подход уходит. Хотя вы можете установить класс, который будет обновлять методы, это не изменит другие аспекты объекта. Очевидным случаем является то, что ваш объект не будет изменен или изменен, чтобы отразить любую разницу в макете участника, а это означает, что когда вы отправляете сообщение об объекте и он обращается к членам, присутствующим в подклассе, но не к суперклассу, реализация вашего метода будет читать или писать неверная память (это неопределенное поведение). Даже если он работает, или вы динамически доказали или сделали все возможное, чтобы обеспечить его безопасность, современные среды выполнения используют не-хрупкий объект ABI - память, требуемая базовыми классами, может свободно меняться от одной версии к другой. Такая конструкция открыта для других ошибок при изменении размера (утечки, память, на которую нельзя ссылаться, или память «инициализированное в типе-преобразование» на данные другого класса). Поэтому, даже если вы преодолели проблему размера выделения, вам все равно нужно будет разработать способ частичного освобождения и частичной инициализации вашего экземпляра таким образом, чтобы объект находился в удобном для использования состоянии - довольно сложно.
Короткий ответ - это просто «НЕТ». –