------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1. 继承
设计两个类Doctor 、Student
<span style="font-size:18px;"><span style="color:#006600;">// doctor 的声明</span>
@interface Doctor :NSObject
{
@public
int weight;
}
- (void)eat;
@end
<span style="background-color: rgb(255, 255, 255);"><span style="color:#006600;">// doctor 的实现</span></span>
@implementation Doctor
- (void)eat
{
NSLog(@"吃完后的体重:%d",weight);
}
@end</span>
<span style="font-size:18px;"><span style="color:#006600;">// student 的声明</span></span>
<span style="font-size:18px;">@interface Student :NSOject
{
@public
int weight ;
}
- (void)eat ;
@end
<span style="color:#006600;">// student 的实现</span>
@implementation Student
- (void)eat
{
NSLog(@"吃完后体重:%d",weight);
}
@end</span>
从上面两个代码块中,我们可以知道,这两个类拥有相同的属性和方法,在这里我们可以 把相同的属性和方法抽取到一个父类中。
抽取重复的代码到父类:
<span style="font-size:18px;"><span style="color:#006600;">// person 的声明</span>
@interface Person : NSObject
{
@public
int weight;
}
- (void)eat;
@end
<span style="color:#006600;">// person 的实现</span>
@implementation Person
- (void) eat
{
NSLog(@"吃完后体重:%d",weight) ;
}
@end</span>
然后子类可在父类的基础上拓充属性和方法
<span style="font-size:18px;"><span style="color:#006600;">// student 的声明</span>
@interface Student : Person
{
@public
int distance ; <span style="color:#006600;">// 定义类的属性:距离</span>
}
- (void)run ;
@end
<span style="color:#006600;">// student 的声明</span>
@implemention Student
- (void)run
{
NSLog(@"Student 跑了%d米",distance) ;
}
@end
</span>
细节问题:
* 子类方法和属性的访问过程:如果子类中没有,就去访问父类。
* 继承后的父类还可以和以前一样使用。
* NSObject 是OC中的最终父类。
* 子类和父类不能拥有相同的成员变量。
继承的好处:
1> 不改变原来的模型的基础上,拓展方法。
2> 建立了类与类之间的联系。
3> 抽取到了公共代码。
坏处:
耦合性太强。
继承的使用场合:
如过一个类中的属性都是你想要的,参用继承;如果类当中部分属性是你想要的,可以抽取出另一个父类。
2.多态
1> 多态的基本概念:
OC 中某一类事物 的多种形态,可以说OC对象具有多态性。
2> 多态的体现
<span style="font-size:18px;">Person *p = [ Student new] ; <span style="color:#006600;"> </span><span style="color:#660000;">// 子类对象赋值给父类指针</span><span style="color:#006600;">
</span>
p —> distance = 100 ; <span style="color:#660000;">// 父类指针访问对应的属性和方法
</span>
[ p run ] ;
</span>
3> 多态的好处
用父类接收参数,节省代码。
4> 多态的局限性
不能访问子类的属性(可以考虑强制类型转换)