OC-探究private修饰的属性能否被继承
2014-12-28 16:15
204 查看
一下纯属个人观点,如有雷同,纯属巧合!
首先温习一下我们所熟知的OC中关于继承的一些常识
子类可以继承父类的:public/protect修饰的成员变量(“属性”或者叫“字段”)。private修饰的不可被被继承
~~~~温习完毕之后,那么问题来了·········
在OC中子类到底能不能继承父类被private修饰的属性呢?
个人在写程序的时候经常会偷懒,比如:
父类Fun有一属性:name,那么声明的时候为了省劲经常这么写:
@property(nonatomic,copy)NSStirng *name;
子类继承父类之后,子类也有了name这个属性了是不是。用得时候就这么用了
self.name = @"张三";
NSLog("%@",self.name);
但在以前我却从来没有考虑过这个name是什么属性的,后来当碰到这类问题时我猜想它使protect,但是protect修饰的属性
在子类中还可以这么用:
_name = "张三";
NSLog("%@",_name);
而property却不可以,网上说这个是缺省的,缺省的就是私有的,叫兽说过:私有的是不能够被继承的-----你是不是在逗我,我跟着叫兽这么用都习惯了
现在才发现叫兽自己挖了个坑自己又往里面跳,而且居然还没意识到自己掉坑里了,更没有意识到坑还是自己挖的。
那到底property声明的是不是私有的?私有的是不是能够被子类继承?
本人首先测试了私有属性的继承性:过程如下所述
定义一个父类Fun,子类FunA、FunB
Fun的私有属性:
@private NSString *_name;
公共函数:
//name的 setter 函数
- (void)setNameWith:(NSString *)newName{
_name = newName;
}
//name的getter函数
- (NSString *)getName{
return _name;
}
//打印函数:NSStringFromClass([self class])是当前调用此函数的类的名称
- (void)print{
NSLog("%@--->%@",NSStringFromClass([self class]),_name);
}
父类的属性和函数到此就完结了,然后就是论证了
论证依据是:
父类的私有字段赋值:name = @"皇上",如果父类的私有属性不能被继承,然后FunB调用打印函数
结果应该“皇上”,
FunA调用name的setter函数并传值:“太子A”,然后FunB调用打印函数,结果应该为:“太子A”,
如果以上成立,private属性不能被继承的结论成立
论证过程:
分别创建三个对象:
Fun *fun = [[Fun alloc] init];
FunA *funA = [[Fun alloc] init];
FunB *funB = [[Fun alloc] init];
[fun setName:@"皇上"];
[fun print];
[funA print];
[funB print];
打印结果:
2014-12-28 16:53:47.993 test---property[1669:60b] Fun--->
[b]皇上[/b]
2014-12-28 16:53:47.993 test---property[1669:60b] FunA---> (null)
2014-12-28 16:53:47.993 test---property[1669:60b] FunB----> [b](null)[/b]
续接上面的代码继续敲:
[funA setName:@"太子A"];
[funB setName:@"太子B"];
[fun print];
[funA print];
[funB print];
打印结果:
2014-12-28 16:53:47.993 test---property[1669:60b] Fun---> 皇上
2014-12-28 16:53:47.993 test---property[1669:60b] FunA---> 太子A
2014-12-28 16:53:47.993 test---property[1669:60b] FunB----> 太子B
这个结果应该可以说明private修饰的属性是可以被子类继承的。所以,平常仅仅使用一个@property来声明创建一个属性,
这个属性的属性是private,子类可以继承使用这个属性,只不过需要通过父类提供的函数而已
子类可以继承父类的私有属性,但是,如果父类没有为子类提供操作这个私有属性的函数,那么纠结继承与否已经没有什么意义了
首先温习一下我们所熟知的OC中关于继承的一些常识
子类可以继承父类的:public/protect修饰的成员变量(“属性”或者叫“字段”)。private修饰的不可被被继承
~~~~温习完毕之后,那么问题来了·········
在OC中子类到底能不能继承父类被private修饰的属性呢?
个人在写程序的时候经常会偷懒,比如:
父类Fun有一属性:name,那么声明的时候为了省劲经常这么写:
@property(nonatomic,copy)NSStirng *name;
子类继承父类之后,子类也有了name这个属性了是不是。用得时候就这么用了
self.name = @"张三";
NSLog("%@",self.name);
但在以前我却从来没有考虑过这个name是什么属性的,后来当碰到这类问题时我猜想它使protect,但是protect修饰的属性
在子类中还可以这么用:
_name = "张三";
NSLog("%@",_name);
而property却不可以,网上说这个是缺省的,缺省的就是私有的,叫兽说过:私有的是不能够被继承的-----你是不是在逗我,我跟着叫兽这么用都习惯了
现在才发现叫兽自己挖了个坑自己又往里面跳,而且居然还没意识到自己掉坑里了,更没有意识到坑还是自己挖的。
那到底property声明的是不是私有的?私有的是不是能够被子类继承?
本人首先测试了私有属性的继承性:过程如下所述
定义一个父类Fun,子类FunA、FunB
Fun的私有属性:
@private NSString *_name;
公共函数:
//name的 setter 函数
- (void)setNameWith:(NSString *)newName{
_name = newName;
}
//name的getter函数
- (NSString *)getName{
return _name;
}
//打印函数:NSStringFromClass([self class])是当前调用此函数的类的名称
- (void)print{
NSLog("%@--->%@",NSStringFromClass([self class]),_name);
}
父类的属性和函数到此就完结了,然后就是论证了
论证依据是:
父类的私有字段赋值:name = @"皇上",如果父类的私有属性不能被继承,然后FunB调用打印函数
结果应该“皇上”,
FunA调用name的setter函数并传值:“太子A”,然后FunB调用打印函数,结果应该为:“太子A”,
如果以上成立,private属性不能被继承的结论成立
论证过程:
分别创建三个对象:
Fun *fun = [[Fun alloc] init];
FunA *funA = [[Fun alloc] init];
FunB *funB = [[Fun alloc] init];
[fun setName:@"皇上"];
[fun print];
[funA print];
[funB print];
打印结果:
2014-12-28 16:53:47.993 test---property[1669:60b] Fun--->
[b]皇上[/b]
2014-12-28 16:53:47.993 test---property[1669:60b] FunA---> (null)
2014-12-28 16:53:47.993 test---property[1669:60b] FunB----> [b](null)[/b]
续接上面的代码继续敲:
[funA setName:@"太子A"];
[funB setName:@"太子B"];
[fun print];
[funA print];
[funB print];
打印结果:
2014-12-28 16:53:47.993 test---property[1669:60b] Fun---> 皇上
2014-12-28 16:53:47.993 test---property[1669:60b] FunA---> 太子A
2014-12-28 16:53:47.993 test---property[1669:60b] FunB----> 太子B
这个结果应该可以说明private修饰的属性是可以被子类继承的。所以,平常仅仅使用一个@property来声明创建一个属性,
这个属性的属性是private,子类可以继承使用这个属性,只不过需要通过父类提供的函数而已
子类可以继承父类的私有属性,但是,如果父类没有为子类提供操作这个私有属性的函数,那么纠结继承与否已经没有什么意义了
相关文章推荐
- JAVA类中的private属性能否被继承
- Java中private属性能否被继承
- 子类继承父类private属性问题
- OC学习第三章 点语法 属性 继承 多态
- Java中子类能够继承父类的private属性或方法吗?
- 黑马程序员---OC基础---封装、继承、多态、@property、id类型、实例变量修饰符
- php类中private属性继承问题分析
- C++:继承访问属性(public/protected/private)
- private属性是否可以被继承
- java中default能否修饰类的方法和属性
- 私有属性private的继承
- OC-010.OC类中的修饰可见性的关键字@private、@protected、@public
- OC学习日记-继承,多态,私有属性、变量和方法,self,super,属性修饰符,description
- public、private、protected属性与public、private、protected继承
- protected函数中含有private属性,此类被继承后,此属性是否有效
- Java静态属性与静态方法能否被继承的问题
- php类中private属性继承问题
- OC语言的第四天 static、self、super、继承、NSObject类、私有属性和私有方法、多态
- Android关于继承-【属性】和【方法】-多态的探究(我会煮很多栗子的)
- iOS runtime探究(三): 从runtime开始理解OC的属性property