子类调用并扩充父类方法

前提:B继承自父类A
父类A中有个类方法如下:

+ (instancetype)itemWithIcon:(NSString *)icon title:(NSString *)title
{
   A *settingItem = [A alloc] init];
    
    settingItem.icon = icon;
    settingItem.title = title;
    
    return settingItem;

}

这样是不合理的,因为如果子类B想调用这个方法并扩充时有时候就走不通了
比如:

+ (instancetype)itemWithIcon:(NSString *)icon title:(NSString *)title destVcClass:(__unsafe_unretained Class)destVcClass
{
    B *settingItem = [self itemWithIcon:icon title:title];
    settingItem.destVcClass = destVcClass;
    return settingItem;
}

此时跑起来会出现我们遇到频率最高的bug:

-[A setDestVcClass:]: unrecognized selector sent to instance 0x7b385920

因为

  • destVcClass这个属性是子类B特有
  • 而[self itemWithIcon:icon title:title]返回的对象settingItem是父类A类型的
  • 所以settingItem也就访问不到子类私有的属性

于是我当时非常傻逼的将返回的对象强转了一下:

B *settingItem = (B *)[self itemWithIcon:icon title:title];

当然还是不对的

经过一步步调试后终于杀死了这只bug,将父类A中那行:

 A *settingItem = [A alloc] init];

改为

 A *settingItem = [self alloc] init];

就可以啦,所以在父类中不要把类型写死
即谁要调用就创建他自己类型的对象

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 35,142评论 18 399
  • 父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog。其中Animal可以是类也可以是接口,Ca...
    木有鱼丸啦阅读 1,024评论 0 4
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,481评论 0 2
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,247评论 0 4
  • 古斯塔斯。勒庞,法国著名社会心理学家。写过很多社会心理学方面的著作,以本书最为有名。一百多年前的法国学者勒庞是个保...
    星期六早晨阅读 702评论 0 0

友情链接更多精彩内容