黑马程序员 OC基础: 面向对象_继承&多态(三)

——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: 方法就是个典型的例子. 还有其他很多有用的小特性等你去发掘.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值