您的位置:首页 > 职场人生

黑马程序员-OC学习笔记-----封装、继承、多态

2015-03-13 10:35 549 查看

封装

封装是把数据和数据操作的实现细节隐藏起来,对外公开接口。这样可以让使用者更加方便,不用过多的去考虑实现细节。我们在封装的过程中也要尽量避免使用@public,这样会破坏类的封装性,我们尽量的把实例变量声明成保护或者私有类型,然后提供相应的设置和访问方法。

继承

一个新的类可以从现有的类中派生出来这个过程称为继承。生成的新的类我们称为子类,原来的类就被叫做父类或者超类。父类相对子类更加抽象,父类一般是子类的共性的集合,子类比父类更具体,是父类的延伸。

在OC中有基类NSObject,所有的类基本都有继承自基类的方法和属性。但是值得注意的是,在OC中没有多继承,这样我们也不用去考虑多继承带来的二义性了。也少了严格意思上的方法重载。

继承的例子:

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
char *_name;
}
-(void)setName:name;
-(char*)name;
-(void)run;
@end


Person.m
#import "Person.h"

@implementation Person
-(void)setName:(char *)name
{
_name = name;
}
-(char*)name
{
return _name;
}

-(void)run
{
NSLog(@"%s runing",_name);
}

@end


Student.h
#import "Person.h"

@interface Student : Person

@end


Student.m
#import "Student.h"

@implementation Student

@end


main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main()
{
Student *p = [[Student alloc] init];
char *name = "tom";
[p setName:name];
[p run];
NSLog(@"%s run",[p name]);
return 0;
}

运行结果:



在上面的例子里面,创建了两个类,子类没有写方法和实例变量,但是通过继承了父类,可以调用父类的所有的方法和成员变量。但是要注意的是当实例变量声明为私有时,我们不能直接调用,而要通过方法来条用。
多态

多态指的是程序在运行的时候会有很多种表现形态。发生多态的条件是前提是有继承。在使用多态是,会进行动态检测,以调用真实的对象方法。多态在代码中的体现即父类指针指向子类对象。多态可以节省很多代码,可以提高代码复用,并且可以调用我们以后新增的类的方法。它的实现在归功于动态绑定机制,而不是函数运行时就把对象类型确定死了。父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。

多态的例子:

Animal.h

#import <Foundation/Foundation.h>

@interface Animal : NSObject

-(void)eat;
@end
Animal.m
#import "Animal.h"

@implementation Animal
-(void)eat
{
NSLog(@"animal is eating");
}
@end
Dog.h
#import "Animal.h"

@interface Dog : Animal

@end
Dog.m
#import "Dog.h"

@implementation Dog
-(void)eat
{
NSLog(@"Dog is eating");
}
@end
Cat.h
#import "Animal.h"

@interface Cat : Animal

@end
Cat.m
#import "Cat.h"

@implementation Cat
-(void)eat
{
NSLog(@"cat is eating");
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Dog.h"
#import "Cat.h"

void fun(Animal *p)
{
[p eat];
}
int main()
{
Dog *d = [Dog new];
Cat *c = [Cat new];
fun(d);
fun(c);
return 0;
}
运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: