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

封装

封装是把数据和数据操作的实现细节隐藏起来,对外公开接口。这样可以让使用者更加方便,不用过多的去考虑实现细节。我们在封装的过程中也要尽量避免使用@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;
}
运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值