封装
权限修饰符@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点了还在写。同事们让玩现代艺术和狼人杀,现在我在写,他们还在玩。。。。