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

黑马程序员——三大特性之继承和多态

2014-09-21 13:05 239 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

**继承:

建立两个类:一个狗 一个猫,属性相同。 继承以后  狗和猫都同时拥有了Animal的属性和方法

//  animal类的建立
#import <Foundation/Foundation.h>
@interface Animal : NSObject
{
int _age;
double _weight;
}
- (void)setAge:(int)age;
- (int)age;
- (void)setWeight:(double)weight;
- (double)weight;
@end
@implementation Animal
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
- (void)setWeight:(double)weight
{
_weight = weight;
}
- (double)weight
{
return  _weight;
}

@end


//  狗类的建立

@interface Dog : Animal    /*这个冒号后就是继承  冒号要是英文的   NSObjict就是一个类。Animal成为dog和cat的父类 dog<span style="white-space:pre">				</span>和cat是Animal的子类。*/
@end
@implementation Dog
@end

//   猫类的建立
@interface Cat : Animal
@end
@implementation Cat
@end
int main()
{
Dog *d = [Dog new];    //new 也是一个类方法  他是存在于NSObiect中的。
[d setAge:10];
NSLog(@"age = %d", [d age]);
return 0;
}

继承的好处:

1、抽取重复代码 

2、建立了类之间的关系 

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

 
注意点:

1、基本上所有类都继承NSObiect 这个基本类  

2、不允许子类和父类拥有相同名称的成员变量 

3、父类必须“声明”在子类前面(实现可以在后) 。  

4、子类可以“重写”实现父类中的某个方法,调用时遵循就近原则。(可以有一样的方法名。而且父类中只有声明,子类来实现也可以) 

5、耦合性太强,相互依赖型强。

 
继承的使用场合:

1、当两个类拥有相同属性和方法时,就可以将相同的东西抽取到一个父类中。
2、当A类拥有B类部分属性和方法时,可以考虑让B类继承A类。两个是同一类的才考虑继承。如果不是同一类可以考虑组合,如下:
如果一个类想拥有另一个类的属性方法,可以考虑继承和组合
继承:xxx是xxx   例,学生是人
组合:xxx拥有xxx     学生拥有成绩

组合

@interface Score : NSObiect
{
int _cScore;
int _ocScore;
}
@end
@implementation Score
@end

@interface Student : NSObject
{
Score  *_score;    // 学生拥有了成绩
int _age;
}
@end
@implementation  Student
@end


继承的关键字:super
[super 方法名];

1、调用父类中的某一方法

2、如果super处在对象方法中,就调用父类的对象方法。 

如果super处在类方法中,那么就调用父类的类方法

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

 
父类:僵尸  子类:跳跃僵尸、铁通僵尸、舞王僵尸

<span style="font-size:18px;">#import <Foundation/Foundation.h>
@interface  Zoobie : NSObject
- (void)walk;
@end
@implementation  Student
- (void)walk
{
NSLog(@"向前走两步");
}
@end

@interface  JumpZoobie : Zoobie
@end
@implementation  Student
- (void)walk              //  因为跳跃僵尸的走和普通僵尸不一样,所以重写
{
NSLog(@"跳两下");

NSLog(@"向前走两步");</span>
<span style="font-size:18px;">/* 也可以用父类方法代替,但[self  walk];是调用自己的方法,所以用[super walk];调用父类的方法,用[super walk];代替这一句代码。。super调用类方法也是这样。*/
}
@end

int main()
{
JumpZoobie *jz = [JumpZoobie new];
[jz walk];
return 0;
}</span><span style="font-size:24px;">
</span>

多态:多种形态

1、没有继承就没有多态

2、代码的体现:父类类型的指针指向子类对象

3、好处:如果函数/方法参数中使用的是父类类型,可传入子类类型、父类类型的对象

4、局限性:父类类型的变量不能直接调用子类特有的方法。要是想调用必须强制转为子类类型变量后,才能直接调用。

 

例如:

#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)eat;
@implementation Animal
- (void)eat
{
NSLog(@"吃吃吃");
}
@end
@interface Dog : Animal
@end
@implementation Dog
- (void)eat
{
NSLog(@"狗吃吃吃");
}
@end

void feed(Animal *a)
int mian()
{
Dog *d = [Dog new]; // Dog型
// 多态。父类指针指向子类对象.。也是dog型,和上面的一行一样作用

Animal *a = [Dog new];  // 父类指针一般不能用来调用子类方法
[a eat];   // 输出是“狗吃吃吃”
Dog *d = (Dog *)a;   // 强制转换类型。
[d run];
// 如果要猫吃、狗也吃则可以这样
feed(d);
Cat *c = [Cat new];
feed(c);        <span style="white-space:pre">	</span>// 这就是多态的好处,如果不这样写,就要定义两个函数分别表示猫狗吃
return 0;
}

@interface Cat : Animal
@end
@implementation Cat
- (void)eat
{
NSLog(@"猫吃吃吃");
}
@end
void feed(Animal *a)
{
[a eat];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐