OC封装、继承、多态,@ public,@ protected,@private
来源:互联网 发布:上瘾网络剧遭下架 编辑:程序博客网 时间:2024/06/05 07:15
person:
#import <Foundation/Foundation.h>
//public 和 protected的区别,就是public的成员变量,可以在继承类中直接访问,而protected不能直接访问,但是可以通过相应的方法访问。
//!!!stu->pwd是错误的,要访问它只能通过相应的方法来访问,但是stu->nickName是可以的。
@interface Person :NSObject
{
@public
NSString *_nikeName;
@protected
NSString *pwd;
NSString *_tall;
}
//---------------!!注意!! --------------------//
//@property关键字自动给属性实现getter和setter
//这里因为Person类里有一个名为_tall的成员变量,@property就为其自动实现一个getter和setter。如果Person类里没有
//_tall的成员变量,那么就会先自动声明一个_tall的成员变量,并自动生成相应的getter和setter。例如_name。
//------------------------------------------//
@propertyNSString *_name;
@property NSString *tall;
@property int _age;
-(void)printfAge;
-(void)say;
@end
#import "Person.h"
@implementation Person
@synthesize _name;
@synthesize _age;
-(void)printfAge
{
NSLog(@"Person");
}
-(void)printfInfo
{
NSLog(@"Person");
}
-(void)say
{
NSLog(@"i am person");
}
@end
main.m
/***************************/
/* */
/* --------------------- */
/* 继承 */
/* --------------------- */
/***************************/
//Foundation库中的类是不能被继承(如:NSString NSArray NSMutableArray)
//---------------!!注意!! --------------------//
//public和 protected的区别,就是public的成员变量,可以在继承类中直接访问,而protected不能直接访问,但是可以通过相应的方法访问。
//------------------------------------------//
//!!!stu->pwd是错误的,要访问它只能通过相应的方法来访问,但是stu->nickName是可以的。
Student *stu=[[Studentalloc] init];
stu._name=@"zhangsan";
stu._age=19;
stu._number=8000611011;
stu->_nikeName=@"laozhang";
NSLog(@"stu name=%@,age=%d,number=%ld",[stu_name],[stu _age],[stu_number]);
//在OC的.h文件中声明的方法都是public的,没有私有的,但是要像实现成员方法的私有化,可以不在.h文件中声明,直接在.m文件中实现成员方法,但这种方式,一旦使用了ARC之后,则不能实现私有方法。这和JAVA和C++中不一样
[stu printfAge];//访问Person中的成员方法。但是却不能访问[stu printfInfo],因为printfInfo是Person类的私有方法
Person *person=[[Personalloc] init];
//[person printfInfo];使用了ARC,编译不通过,只能使用categroy来实现方法的私有化,后续章节会讲到
[stu personSay];// category为Person扩充的方法,同样能再继承给子类
/***************************/
/* 多态 */
/* --------------------- */
/* !! 多态是针对继承且子类重 */
/* 写父类中的方法来说的 */
/* --------------------- */
/***************************/
//在OC中,一个对象指针有两个类型:一个是定义时的类型,一个是运行时的类型。定义时的类型是定义时确定的,运行时的类型是由给其赋值的对象所决定的。在这里stu2定义时是Person,运行时是Student。(和JAVA和C++中是一样的)
//如果一个对象指针定义时的类型和运行时的类型不一样,就会产生多态,即对象指针(不同类型)调用同一个方法名,会执行不同的方法,我们称其为多态
Person *stu2=[[Studentalloc] init];//不同类型
[stu2say];
//[stu2 stuSay]; //错误方式,父类对象指针不能调用子类中添加的新方法,如果非要调用那么必须将父类对象指针强制转换为子类对象指针。
//强制转换的前提是:父类对象指针真的指向了子类对象,即在堆区的确是为子类对象分配的内存空间,才能强制转换成子类对象指针
[(Student*)stu2stuSay];//强制转换
//!!多态是针对继承且子类重写父类中的方法来说的。
Person *stu3=[[Personalloc] init];//同一类型
[stu3say];
//判断对象指针是否是指向某个对象的类
//iskindofclass
if([stu2 isKindOfClass:[Studentclass]])
NSLog(@"stu2 is a Stuednt");
else
NSLog(@"stu2 is not a Student");
【注】
//实际工作中,根本不需要使用权限,都使用缺省的保护权限就可以了。
//如果你想要成员变量被外部函数访问,声明成属性。
//如果你想变量不被子类继承,不对外公开。声明在实现里。
@implementation Father
{
int x;
}
【方法的权限】
【注】
//OC中成员方法都是公有的,可以被继承,可以被外部方法访问。
//没有在接口中做声明的方法,这个方法不能被外部函数直接访问。
//通过不声明(或者仅在匿名类别中声明),我们模拟了私有方法,这个过程,有时被称为方法的私有化。
【注】下面情况,方法私有化不成功
1.父类公有的方法,子类重写,即使子类不声明,方法也是公有的。
2.在协议中声明的方法,遵从协议的对象,即使不声明,只实现,方法也是公有的
【另】方法的私有化,声明即外露,不声明即不外露。因为import不能包含.m文件。这是因为OC语言设计之初,借鉴了很多其他优秀的语言,其中一个类的创建借鉴了C++中将方法声明和实现分开,同时也借鉴了JAVA中的接口,其实OC中的.h文件就是接口文件,@interface--@end ,而.m文件就是实现这个接口文件@implementation--@end。因为接口是是可以被实现的,所以OC中的语法上来说没有私有化方法。
- OC封装、继承、多态,@ public,@ protected,@private
- public、private、protected继承
- public、protected、private继承
- 关于PUBLIC、PROTECTED、PRIVATE继承
- public private 和protected 继承
- public、protected和private继承
- public、protected和private继承
- public,protected,private继承区别
- public private 和protected 继承
- public private 和protected 继承
- public private 和protected 继承
- public、private和protected继承
- C++继承(public/protected/private)
- public, private, protected继承说明
- public private 和protected 继承
- public private 和protected 继承
- public private 和protected 继承
- C++继承public protected private
- error: ‘nullptr’ was not declared in this scope
- UVa-1225 - Digit Counting
- Dynamic Type of Python-Part 1-Learning Python
- C里面的const
- 笔试题之Java基础部分
- OC封装、继承、多态,@ public,@ protected,@private
- 犀牛——第19章 JQuery类库 19.1JQuery基础
- UVA 1586 分子量
- matlab解状态方程组
- Activity保存状态
- 机房收费系统概要说明书
- 从日志中找出资产限制出错的并处理
- jstl core标签
- 迭代器的使用