封装
封装是把数据和数据操作的实现细节隐藏起来,对外公开接口。这样可以让使用者更加方便,不用过多的去考虑实现细节。我们在封装的过程中也要尽量避免使用@public,这样会破坏类的封装性,我们尽量的把实例变量声明成保护或者私有类型,然后提供相应的设置和访问方法。
继承
一个新的类可以从现有的类中派生出来这个过程称为继承。生成的新的类我们称为子类,原来的类就被叫做父类或者超类。父类相对子类更加抽象,父类一般是子类的共性的集合,子类比父类更具体,是父类的延伸。
在OC中有基类NSObject,所有的类基本都有继承自基类的方法和属性。但是值得注意的是,在OC中没有多继承,这样我们也不用去考虑多继承带来的二义性了。也少了严格意思上的方法重载。
继承的例子:
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
char *_name;
}
-(void)setName:name;
-(char*)name;
-(void)run;
@end
#import "Person.h"
@implementation Person
-(void)setName:(char *)name
{
_name = name;
}
-(char*)name
{
return _name;
}
-(void)run
{
NSLog(@"%s runing",_name);
}
@end
#import "Person.h"
@interface Student : Person
@end
#import "Student.h"
@implementation Student
@end
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main()
{
Student *p = [[Student alloc] init];
char *name = "tom";
[p setName:name];
[p run];
NSLog(@"%s run",[p name]);
return 0;
}
运行结果:
多态
多态指的是程序在运行的时候会有很多种表现形态。发生多态的条件是前提是有继承。在使用多态是,会进行动态检测,以调用真实的对象方法。多态在代码中的体现即父类指针指向子类对象。多态可以节省很多代码,可以提高代码复用,并且可以调用我们以后新增的类的方法。它的实现在归功于动态绑定机制,而不是函数运行时就把对象类型确定死了。父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。
多态的例子:
Animal.h
#import <Foundation/Foundation.h>
@interface Animal : NSObject
-(void)eat;
@end
Animal.m
#import "Animal.h"
@implementation Animal
-(void)eat
{
NSLog(@"animal is eating");
}
@end
Dog.h
#import "Animal.h"
@interface Dog : Animal
@end
Dog.m
#import "Dog.h"
@implementation Dog
-(void)eat
{
NSLog(@"Dog is eating");
}
@end
Cat.h
#import "Animal.h"
@interface Cat : Animal
@end
Cat.m
#import "Cat.h"
@implementation Cat
-(void)eat
{
NSLog(@"cat is eating");
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Dog.h"
#import "Cat.h"
void fun(Animal *p)
{
[p eat];
}
int main()
{
Dog *d = [Dog new];
Cat *c = [Cat new];
fun(d);
fun(c);
return 0;
}
运行结果: