黑马程序员——OC基础三大特性

黑马程序员——OC基础---三大特性
       ------- android培训ios培训、期待与您交流! ----------

三大特性

概述:

1、概念:OC中用于操作类和对象的规则和方法,包括封装、继承和多态。

2、作用:保证数据的安全,简明语法,增强类与类之间联系。

3、特点:通过构造函数或继承类,达到保证数据安全,简明语法的目的。

4、好处:数据始终在控制范围内,简明了语法。

5、弊端:父类调用子类特有方法,编译器报错,类与类之间的联系太过紧密,父类变化,导致其他子类变化。

1、成员变量的封装

Set方法:通过p->age = 20修改成员变量的方式容易导致出错,为保证数据安全,提供一个方法给外界设置成员变量值,并对输入数据过滤。

Set方法命名规范:

1> 方法名必须以set来头。

2> set后面跟成员变量名称,其首字母必须大写。

3> 返回值一定是(void)。

4> 一定要接受一个参数,而且参数类型跟成员变量类型一致。

5> 形参名称不能与成员变量名称一致。

Get方法:给外界提供一个查看成员变量的方法。

Get方法命名规范:

1>方法名与成员变量名一致。

2>肯定有返回值,返回值与成员变量名一致。

3>不需要接收任何参数。

示例:

 

@interface Person : NSObject
{
	int age;
	double height;
}
// age的getter和setter。
- (void)setAge:(int)age;
- (int)age;
// height的getter和setter。
- (void)setHeight:(int)height;
- (int)height;
@end
@implementation Person
// age的getter和setter的实现。
- (void)setAge:(int)age
{
	_age = age;
}
- (int)age
{
	return _age;
}
// height的getter和setter的实现。
- (void)setHeight:(int)height
{
	_height = height;
}
- (int)height
{
	return _height;
}
@end


注意:****************************************************

1、成员变量命名以下划线开头(便于与get方法和局部变量区分)。

2、OC弱语法[person test],源代码中没有test,编译器只有警告。

3、不声明任何方法属性,也可运行,编译器只有警告。

4、类方法以加号开头,可与对象方法重名,但不可用来访问对象方法。

5、方法内部不需要使用成员变量时就用类方法。

************************************************************

关键字self的使用:指向当前对象,可用[self  方法名]调用方法,也可用[self 成员变量名]访问成员变量。

总结与思考:set方法内部可以加上一些容错程序,禁止出现不符合逻辑等错误,对于有些属性,值是固定的,可以只写get方法,而不写set方法。

2、继承

说明:以@interface Person : NSObject 为例。:NSObject表示类Person继承了系统定义类NSObject的一切属性。

代码示例:

@interface Student : Person
@end
@implementation Student
@end
int main()
{
	[student setAge:12];
	NSLog(@"学生的年龄是%d",[student age]);
}

继承的好处:

1>抽取重复代码

2>建立类之间的关系。

3>子类可以拥有父类的所有成员变量和方法。

注意点:

1>基本上所有类的根类都是NSObject。

2>子类可以在父类的基础上继续延伸。

规范:

1>子类和父类中不可以有相同的成员变量。

2>子类和父类中可以有一样的方法名。

3>子类的方法重写可以覆盖父类的方法名。

4>父类必须声明在子类的前面。

5>对象里面的isa指针指向类,类里面的supperclass指针指向其父类。

6>执行时先在子类中找方法,找不到再去父类中找。

总结与思考继承可以减少类别相同对象的属性和方法代码量,但它的缺点是耦合性太强,即类与类之间的关系过于紧密,父类方法的改变会影响子类方法的变化,所以父类的方法应该是少而应用广泛。


关键字supper的用法:

1>跨越所在块调用父类的方法。

2>在对象方法中,调用父类的对象方法,在类方法中调用父类的类方法。

3>使用场合:子类在重写父类方法时,想保留父类的一些行为。

@implementation Zoombie
- (void)walk
{
    NSLog(@"跳两下----");
    [supper walk]; // 保留父类对象的方法。
} 


3、多态      

概念:父类指针指向子类对象。

好处:如果函数参数中使用的是父类类型,可以传入父类子类对象。

局限性:父类对象调用只有子类对象拥有的方法时,编译器有警告,想调用此类方法,需要强制转换类型。

代码实现:

// 喂相应动物的相应方法。
//void feed(Dog *d)
//{
//    [d eat];
//}
//
//void feed2(Cat *c)
//{
//    [c eat];
//}
// 如果参数中使用的是父类类型,可以传入父类、子类对象,这样省略了很多重复代码。
void feed(Animal *a)
{
    [a eat];
}
int main()
{
    Animal *aa = [Animal new];
    feed(aa);
    
    Dog *dd = [Dog new];
    feed(dd);
    
    Cat *cc = [Cat new];
    feed(cc); 
    return 0;
}

总结与思考: 多态主要用于多个子类使用一个对对象做同样操作的函数时,不需要写很多参数类型不同的函数,参数类型使用父类指针,所有的子类就可以向函数发送对象,这种功能减少了很多重复代码,但是因为OC是弱语法,用错误类型的指针指向对象,编译器只是报错,所以,书写时一定注意规范!


 ------- android培训ios培训、期待与您交流! ----------

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值