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关键字自动给属性实现gettersetter

//这里因为Person类里有一个名为_tall的成员变量,@property就为其自动实现一个gettersetter。如果Person类里没有

//_tall的成员变量,那么就会先自动声明一个_tall的成员变量,并自动生成相应的gettersetter。例如_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之后,则不能实现私有方法。这和JAVAC++中不一样

        

        [stu printfAge];//访问Person中的成员方法。但是却不能访问[stu printfInfo],因为printfInfoPerson类的私有方法

       Person *person=[[Personalloc] init];

        //[person printfInfo];使用了ARC,编译不通过,只能使用categroy来实现方法的私有化,后续章节会讲到

        

        

        [stu personSay];// categoryPerson扩充的方法,同样能再继承给子类

        

        

        /***************************/

        /*        多态              */

        /*  ---------------------  */

        /*  !! 多态是针对继承且子类重  */

        /*     写父类中的方法来说的    */

        /*  ---------------------  */

        /***************************/

        

        //OC中,一个对象指针有两个类型:一个是定义时的类型,一个是运行时的类型。定义时的类型是定义时确定的,运行时的类型是由给其赋值的对象所决定的。在这里stu2定义时是Person,运行时是Student。(和JAVAC++中是一样的)

        //如果一个对象指针定义时的类型和运行时的类型不一样,就会产生多态,即对象指针(不同类型)调用同一个方法名,会执行不同的方法,我们称其为多态

        

        

       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中的语法上来说没有私有化方法。





0 0
原创粉丝点击