黑马程序员-OC学习笔记-----封装、继承、多态

来源:互联网 发布:python web入门 编辑:程序博客网 时间:2024/06/05 22:48

封装

封装是把数据和数据操作的实现细节隐藏起来,对外公开接口。这样可以让使用者更加方便,不用过多的去考虑实现细节。我们在封装的过程中也要尽量避免使用@public,这样会破坏类的封装性,我们尽量的把实例变量声明成保护或者私有类型,然后提供相应的设置和访问方法。

继承

一个新的类可以从现有的类中派生出来这个过程称为继承。生成的新的类我们称为子类,原来的类就被叫做父类或者超类。父类相对子类更加抽象,父类一般是子类的共性的集合,子类比父类更具体,是父类的延伸。

在OC中有基类NSObject,所有的类基本都有继承自基类的方法和属性。但是值得注意的是,在OC中没有多继承,这样我们也不用去考虑多继承带来的二义性了。也少了严格意思上的方法重载。

继承的例子:

Person.h

#import <Foundation/Foundation.h>@interface Person : NSObject{    char *_name;}-(void)setName:name;-(char*)name;-(void)run;@end


Person.m
#import "Person.h"@implementation Person-(void)setName:(char *)name{    _name = name;}-(char*)name{    return _name;}-(void)run{    NSLog(@"%s runing",_name);}@end


Student.h
#import "Person.h"@interface Student : Person@end


Student.m
#import "Student.h"@implementation Student@end


main.m
#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;}
运行结果:



0 0