——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——
继承
平时我们在写类的时候,往往会有一些相似的类里面会写一些同样的方法.
在合适的时机使用继承的特性,会帮我们省不少功夫.
继承的好处:
1.抽取重复代码
2.建立了类之间的关系
@interface Animal : NSObject
: 冒号就是我们常用的继承写法
[Animal new]
有没有想过 new 这种类方法来自哪里?
没错,其实它就来自与 NSObject 这个类.
我们通过 :冒号 继承的特性,让我们的 Animal 类也在没有 new 方法的情况下一样能使用 NSObject 中的 new 方法.
子类可以拥有父类中的所有成员变量和方法.
注意点:基本上所有类的根类是 NSObject
这样一来,使用继承的功能会使我们的编码效率得到提高.
继承的使用场合
继承的使用场合
1> 当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父对象中
2> 当 A 类拥有 B 类的部分属性和方法是,可以考虑让 B类继承 A 类
/* animal 的声明 */
@interface Animal : NSObject
{
int _age;
}
- (void)setAge:(int)age;
- (int)age;
@end
/* animal 的实现 */
@implementation Animal
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
@end
// : Dog 继承了 Animal, 相当于拥有了 Animal 里面的所有成员变量和方法
// Animal 为 Dog 的父类 Dog 为 Animal 的子类
@interface Dog : Animal
@end
@implementation Dog
@end
注意点和继承的缺点
注意点:
1. 父类必须声明在子类的前面
2. oc 中不允许子类和父类有相同名称的成员变量,否则会冲突
3. 调用某个对象的方法时,有限去当前兑现中找,如果找不到,去父类中找
重写: 子类重新实现父类中的某个方法
坏处:
耦合性太强.
当我们的代码写的非常垃圾的时候,一旦我们不得以把写好的父类删除,那么他的子类就会变成一大堆烂摊子.
super的作用
@interface Zoombie : NSObject
- (void)walk;
@end
@implementation Zoombie
- (void)walk
{
NSLog(@"走两步");
}
@end
@interface JumpZoombie : Zoombie
@end
@implementation JumpZoombie
- (void)walk
{
NSLog(@"跳两下");
NSLog(@" 往前走两步");
//[self walk]; 又调用了当前对象方法,陷入死循环.
[super walk]; // 直接调用父类的方法
}
@end
int main()
{
JumpZoombie *p = [JumpZoombie new];
[p walk];
return 0;
}
打印结果:
跳两下
往前走两步
走两步
这里的 JumpZoombie 类中重写了 walk 方法
我们在调用 JumpZoombie 的walk 方法时就调用了自己的 walk方法
那么当我们还想调用父类的对象方法时,就轮到 super 派上用场了
super 的作用:
1.直接调用父类中的某个方法
2.super 处在对象方法中,调用父类的对象方法.
super 处在类方法中,调用父类的类方法.
3.使用场合:子类重写父类的方法时,保留父类的方法.
多态
多态的好处在于能减少代码冗余,方便调用函数的时候传递参数
void feed(Animal *a)
{
[a eat];
}
int main ()
{
// 多态 : 父类指针指向子类对象
Animal *c = [Cat new];
Animal *a = [Dog new];
// 调用方法时会检测对象的真实形象,调用的任然是 Dog 中的 eat 方法
[a eat];
feed(c); // 好处:如果参数中使用的是父类类型,可以传入父类/子类对象
feed(d);
return 0;
}
在我看来,多态没什么特别的.
对象的实际内容并没有什么变化.
传参数的方法更像是指针类型的强制转换,指针指向的实际内容没有改变
注意点
多态
1.没有继承就没有多态
2.代码的体现:父类型的指针指向子类对象
3.好处:如果函数\方法参数中使用的是父类类型的变量 不能直接调用子类特有的方法
多态的局限性: 不能用父类类型的变量 调用子类的方法,虽然成功,但不规范(这一点让我感觉这就是一种对指针的封装,都能调用嘛,就是不规范)
oc 中的字符串
NSString *str = @"itcast";
NSLog(@"%@",str);
这样的写法就算用 NSSrting生成了一个字符串对象了.
使用了对象的字符串,就可以享受 oc 提供的各种对字符串的方法.
非常方便.
int main()
{
int age = 15;
int no = 5;
NSString *newStr = [NSString stringWithFormat:@"age is %d and no is %d",age,no];
NSLog(@"----- %@",newStr);
return 0;
}
比如 stringWithFormat: 方法就是个典型的例子. 还有其他很多有用的小特性等你去发掘.