【黑马程序员】-我的OC学习笔记(2)-封装、继承、多态

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

</pre><p></p><p><span style="white-space:pre"></span>面向对象的三个重要特点是:封装、继承、多态。OC也支持这三大特性,但OC与一般的面向对象语言不同,OC不支持多重继承只支持单继承。</p><p><span style="white-space:pre"></span>一、封装的概念</p><p><span style="white-space:pre"></span>封装在我的学习理解中就感觉像是我们日常所用的电子产品,比如手机一样,我们都知道我们可以使用手机打电话、发短信、聊微信、、、,但是我们却并不知道手机具体实现这些功能的技术细节,这就是封装。引用到类中我们也可以这样去理解封装,我们影藏了我们不想被外界访问的数据和方法的具体实现细节,我们只像外界提供我们定义的方法接口,让别人去使用接口而不关注具体的实现细节和数据类型。这就是面向对象中的封装的概念。</p><p><span style="white-space:pre"></span>在封装的概念下,自然的我们就要关注一个事情那就是实例变量的作用域。即我如何控制我的实例变量能否被外界访问、能被哪些人访问,在OC中我们使用访问修饰符:@public、@protected、@private来进行实例变量的权限控制。这三个修饰符的修饰权限规则如下:</p><p> <span style="white-space:pre"> </span>@public:公开的,在任何地方都可以使用实例变量进行访问;</p><p><span style="white-space:pre"></span>@protected:受保护的,只能在当前类和子类中访问;</p><p><span style="white-space:pre"></span>@private:私有的,只能在当前类中使用或对象方法中使用;</p><p><span style="white-space:pre"></span>如下代码所示:</p><p> </p><pre name="code" class="objc">//定义一个Person类,Person.h
#import <Foundation/Foundation.h>

#interface Person : NSObject
{
	@public
	NSString _name;//定义一个共有的属性name
	@protected
	int _age;//定义一个保护类型的属性age
	@private
	double _weight;//第一一个私有属性weight
}
-(void)setName: (NSSting *)name;
-(void)setAge: (int) age;
-(void)setWeight: (double) weight;
-(NSString)name;
-(int)age;
-(double)weight;
@end

//实现的文件Person.m
#import"Person.h"
@implementation Person

-(void) setName:(NSString *)name
{
	_name = name;
}

-(void) setAge:(int) age
{
	_age = age;
}

-(void) setWeight:(double) weight
{
	_weight = weight;
}

-(NSString) name
{
	return _name;
}

-(int) age
{
	return age;
}

-(double) weight
{
	return _weight;
}

@end
我们定义了一个Person类,其有三个属性name、age、weight,其中name是公有的、age是受保护的、weight是私有的,我们可以在main函数中直接访问name但是却不能访问age和weight,因为我们使用权限修饰符隐藏了他们,使得他们的属性不会被我们不愿意的方法使用。同时我们为各个属性编写了各自的set和get方法,使得我们可以调用这些接口操作我们隐藏的属性,同时我们也隐藏了这些方法的实现细节,这样我们就很好的封装了Person类。

二、继承

面向对象的第二个重要的特性是继承,继承就是从他的基类或称之为父类继承方法或属性,就像是儿子继承父亲的遗产一样,父类有的属性和在头文件中声明的方法在其子类中都有对应属性和方法。同时OC支持子类对父类方法的重写,即在子类中实现一个与父类具有同类型的返回值、方法名、形参列表的方法。继承的代码实现为@interface 类名 : 父类名。例如以下代码:

//定义一个Animal类
@interface Animal : NSObject
{
	int _age;
	int _weight;
}
-(void) eat:(NSString *)foodName;
-(void) run;
@end

//实现Animal类
@implementation Animal

-(void) eat:(NSString *)foodName
{
	NSLog (@"动物吃%@", foodName);
}

-(void) run
{
	NSLog (@"动物移动");
}

//定义一个Bird类继承Animal类
@interface Bird : Animal
@end

//Bird的实现
@implementation Bird
-(void) run
{
	NSLog (@"%d岁的小鸟在飞翔");
}
@end
如上代码我们就定义了一个Bird类来继承Animal类,而Animal类也继承了NSObject类。实则上Bird继承了NSObject类和Animal类,OC不支持多重继承,但支持多层继承,即如果我再定义一个Bugu鸟类继承Bird类依旧可以。在上述代码中我们重写了run方法,因此我们用如下代码调用run方法将得到不同的效果:Animal *ani = [Animal new];

[ani run];将打印出结果:动物移动;Bird *bird = [Bird new]; [bird run];将打印出结果:3岁的小鸟在飞翔(假设已设定年龄为3),由此我们可以看出子类继承了父类的非私有方法和属性,并且在子类中可以进行访问。对于父类的私有属性,子类依旧继承了但只是不能访问而已。

三、多态

OC中的多态的概念一句话来说就是不同的对象以自己的方式响应相同名称方法的能力称为多态。这句话中包含了多态的条件:需要有继承关系、有方法的重写;所以多态可以这么理解:我们在父类中声明通用的方法,而具体的对象以自己的策略实现具体的方法。比如上述的Animal和Bid代码实现,我们就可以这样来调用Bird的run方法:

Animal *ani = [Bird new]; [ani run];结果为:3岁的小鸟在飞翔;这就是多态的一种表现。而多态的优点是简化了编程的接口,他容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数名字一个新名字。多态也使得代码可以分散在不同的对象中而不用试图在一个函数中考虑到所有的可能。而多态的原理则牵涉到OC中的动态绑定,动态绑定的概念就是直到程序运行时才确定要对对象调用的实际方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值