第二讲 封装 继承 多态
A.封装(成员变量/方法的封装)
1.封装是建立在类的基础之上。
a.封装的好处:
@interface Student :NSObject
{
@public
Int age;
}
//提供一个方法给外界设置age的属性值
//我们称作set方法。有命名规范
/*
Set方法
1.作用;提供一个方法给外界设置成员变量值
2.命名规范:
a.方法名必须以set开头
b.set后面跟上成员变量名称,成员变量的首字母必须大写
c.返回值一定是void
d.一定要接收一个参数,而且参数类型跟成员变量类型一致
e.形参的名称不能跟成员变量名一样
*/
-(void)setAge:(int)newAge;
-(void)study;
@end
//实现中
@implemention Student
-(void)setAge:(int)newAge
{
//对传进来的数据进行过滤
Age = newAge;
}
-(void)study
{
NSLog(@”学习”);
}
@end
Int main()
{
Student *stu = [Student new];
Stu->age = 20;
[stu setAge:10];//对成员变量进行赋值
Return 0;
}
/*
get方法
1.作用; 返回对象内部的成员变量
2.命名规范:
a. 肯定有返回值,返回值类型肯定与成员变量一致
b. 方法名跟成员变量一样
c.不需要接收任何参数
d.
e
*/
@implemention Student
-(void)age
{
Return age;
}
-(void)setAge:(int)newAge
{
//对传进来的数据进行过滤
Age = newAge;
}
-(void)study
{
NSLog(@”学习”);
}
@end
2.封装的命名规范
a.成员变量的封装:set和get方法,例如成员变量有_age
//成员变量名命名规范:一定要以_(下划线)开头
//set方法
-(void)setAge:(int)age
{
_age = age;
}
//get方法
-(int)age
{
Return _age;
}
3.OC的弱语法
a.在主函数中调用了方法,但是在实现和声明中没有对应文件,编译器编译的时候会出现警告而不会出现错误。然而在执行的时候会出现错误,编译器报错,并且是经典错误。给类发送了一个不能识别的消息。
b.OC是在运行的时候才会检测对象有没有实现
4.类方法使用
a.类方法都是以+(加号)开头
//在声明中
+(void)printClassName;
//在实现中
+(void)printClassName
{
NSlog(@”类方法”);
}
b.类方法和对象方法的区别
//类方法只能用类来调用、以+号开头、类方法不依赖于对象,不能在内部去访问成员变量。
//对象方法只能用对象来调用、以-号开头
//可以允许类方法和对象方法同名
//类方法的好处和使用场合
1.不依赖于对象,执行效率高。
2.能用类方法尽量用类方法
3.场合:当方法内部不需要访问到成员变量,就可以改变为类方法。
c.类方法练习
//工具类:基本没有任何成员变量,里面的方法基本都是类方法。
5.self关键字用法
//在类的对象方法中,同样也遵循作用域规则,这时输出显示的_age将不是成员变量的值,而是int _age = 20的值。
//可以使用self->_age来指向成员变量。
//self调用当前(self所在方法中的方法)方法,会进入死循环。
//self在什么中,就调用什么。比如在对象方法中,就会调用相关的对象方法。如果self在类方法中就会调用与类方法有关的方法。
B.继承使用
1.类A、类B;如果类A继承了类B,则类B为父类,类A为子类。并且类A继承了类B中的成员变量和方法。
//狗、猫、鱼,,等都是动物,他们有共同的属性和行为。我们在写的时候就可以用继承的方式来实现。
//继承实现规范
@interface 类名1 :类名2 //类名1继承了类名2
@end
//首先定义父类
@interface Animal :NSObject
@end
//Dog继承了Animal。Animal为Dog的父类。
@interface Dog :Animal
@end
2.继承的好处
a.抽取重复代码
b.建立了类之间的关系
c.子类可以拥有父类中的所有成员变量和方法。
d.基本上所有类继承于NSObject类。
3.使用继承需要注意的地方
a.不允许子类和父类拥有相同的名称的成员变量。并且父类要放到使用的最前面(父类必须放在子类的前面)
b.在继承关系中,在子类中调用方法时,会首先在子类中寻找对应的方法,如果有则执行当前方法,如果没有会进入父类中寻找调用的方法。
C.重写:子类覆盖父类中的方法(子类方法名和父类中的方法名相同)
4.继承和组合
a.继承:
1.当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中来。
2.当A类拥有B类中的部分方法和属性时,可以考虑让B类来继承A类。
b.组合:
1.组合:xxx 拥有 xxx;继承:xx 是 xxx
//self指向当前类方法的调用。super指向父类方法的调用。
C.多态使用
1.多态:多种形态,是建立在继承的基础之上的。没有继承就没有多态。
//父类
@interface Animal :NSObject
-(void)eat;
@end
@implemention Animal
-(void)eat
{
NSLog(@”动物吃”)
}
@end
//子类
@interface Dog:Animal
-(void)eat;
@end
@implemention Dog
-(void)eat
{
NSLog(@”狗吃”)
}
@end
//主函数
Int main()
{
//多种形态:父类指针指向子类对象
Dog *d = [Dog new];
Animal *a = [Dog new];
[a eat];
Return 0;
}
//运行结果是狗吃东西。处多态状态,调用方法时会检测对象的真实形象
2.多态的好处和使用局限
a.如果参数中使用的是父类类型,可以传入父类、子类对象
b.父类类型的变量,不能用来调用子类的方法。
c.如果要实现b中的情况,请用强制转换。