ios学习第三天(三)封装继承多态

封装

权限修饰符@public @protected 和@private

被@public修饰的属性在任何地方都可以访问

被@protected 修饰的属性在这个类内部和子类中可以访问,不写修饰符,默认@protected 

被@private修饰的属性只能在当前类内部可以访问


方法分为类方法和对象方法,类方法前用“+”修饰,对象方法前用“-”修饰。(所谓的类方法相当于java中静态方法,对象方法就是普通方法)


继承

上一篇已经提过了应该怎么定义一个类,也提过了一个类怎么继承另一个类。@interface 类名: 继承的类名{} 在“:”后面写上要继承的类名即可。继承好处很明显:
1.可以减少冗余代码(把共有属性和行为抽取出来,子类继承父类,代码量大幅度减少)
2.增加代码通用性(就像生物一样,要适应恶劣的自然环境,新生的一代会发生一些变异,有些变异可以适应新的环境。但是代码所不同的是,是有计划,有组织的变异,继承后就可以满足新的需求。这里说通用性,是这个意思,前人写好的类一般不能完全满足我们项目的需求,这时继承它,添加少量的代码,即可满足,前人写的代码不至于立刻废弃掉,有较强的生命力。)

多态

想起曾经学习面向对象的时候,老师给我们说什么是多态,容我懒一把,直接套用老师经典的语录。

1.父代子类(父类指代子类)

2.一口多现(同一个接口,多种实现方式)。


在下面代码中,总共定义了三个类:Animal类 Dog类 和Bird类

其中Dog类和Bird类是Animal类的子类。Dog和Bird是并列关系。借助这三个类,来说明什么是封装,继承和多态,文件比较多总共7个,耐心查看吧。

在这里附上源代码下载地址是:http://download.csdn.net/download/moluth/9807126

建议下载之后在Xcode上看。

Animal.h

#import <Foundation/Foundation.h>

//Animal是一个普通的类,继承NSObject
@interface Animal : NSObject{
@private int age;//私有属性,仅仅在该类内部可以访问
@public NSString *name;//共有属性,任意位置可以访问
    //除此之外还有@protected 代表在本类内部可以访问,在子类中可以访问。
}
-(id)initWithNameAndAge:(NSString*) name :(int) age;
-(void)cry;
-(void)eat;
@end


Animal.m

#import "Animal.h"

@implementation Animal
-(id)initWithNameAndAge:(NSString*) name :(int) age{
    self=[super init];
    self->name=name;
    self->age=age;
    return self;
}
-(void)cry{
    NSLog(@"%@是一个动物,在叫",name);
}
-(void)eat{
    NSLog(@"%@是一个动物,在吃东西",name);
}
@end


Dog.h

#import "Animal.h"

//Dog 是Animal的子类,代码不多但是功能却比Animal强大,继承可以提高代码复用率
@interface Dog : Animal{
@public int numberOfleg;
}
-(void)watchOverHouse;

@end


Dog.m

#import "Dog.h"

@implementation Dog
-(void)watchOverHouse{
    NSLog(@"%@是一只小狗:看家ing...",name);
}

-(void)cry{
    NSLog(@"%@是一只小狗:汪汪汪",name);
}
-(void)eat{
    NSLog(@"%@是一只小狗:啃骨头",name);
}
@end


Bird.h

#import "Animal.h"

Bird 是Animal的子类,代码不多但是功能却比Animal强大,继承可以提高代码复用率
@interface Bird : Animal
-(void)fly;
@end


Bird.m

#import "Bird.h"

@implementation Bird
-(void)fly{
    NSLog(@"%@是一只小鸟:自由自在的飞翔",name);
}

-(void)cry{
    NSLog(@"%@是一只小鸟:叽叽喳喳",name);
}
-(void)eat{
    NSLog(@"%@是一只小鸟:吃虫子",name);
}


@end


main.m

#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Dog.h"
#import "Bird.h"

int main(int argc, const char * argv[]) {
    
    //Dog 是 Animal的子类,可以调用父类方法,子类可以继承父类的行为和属性
    Dog *dog=[[Dog alloc] initWithNameAndAge:@"小花" :3];
    [dog cry];//小花是一只小狗:汪汪汪
    //看家不是Animal的行为,子类功能在父类基础上,更多了一些,这是继承的好处
    [dog watchOverHouse];//小花是一只小狗:看家ing...
    
    Bird *bird=[[Bird alloc] initWithNameAndAge:@"小黄鹂" :5];
    [bird cry];//小黄鹂是一只小鸟:叽叽喳喳
    [bird fly];//小黄鹂是一只小鸟:自由自在的飞翔
    NSLog(@"%@",bird->name);//小黄鹂 Bird类中没有声明name属性,却可以调用,这是继承父类属性的证据。
    
    
    
    //Animal是Dog 和 Bird的父类,父类指代子类,是多态表现
    Animal *a1=[[Animal alloc] initWithNameAndAge:@"小东":8];
    Animal *a2=dog;
    Animal *a3=bird;
    
    //a1,a2,a3同样都是Animal,同样调用eat方法,行为却不一样,这是多态的表现
    [a1 eat];//小东是一个动物,在吃东西
    [a2 eat];//小花是一只小狗:啃骨头
    [a3 eat];//小黄鹂是一只小鸟:吃虫子
}


没想到花了这么久,真是的。到晚上10点了还在写。同事们让玩现代艺术和狼人杀,现在我在写,他们还在玩。。。。


 



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值