——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
/*
多态
1.没有继承就没有多态
2.代码的体现:父类类型的指针指向子类对象
3.好处:如果函数或方法变量参数中使用的是父类类型,可以传入父类、子类对象
4.局限性:
1》父类类型的变量 不能 直接调用子类特有的方法,必须强转为子类类型变量后,才能直接访问子类特有的方法
*/
#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@"吃东西----");
}
@end
@interface Dog : Animal
@end
@implementation Dog
- (void)eat
{
NSLog(@"Dog吃东西----");
}
@end
int main()
{
Dog *d = [Dog new];//dog 类型
// 多态:父类指针指向子类对象
Animal *a = [Dog new];
//多态的局限性:父类类型的变量 不能用来调用子类的方法
Dog *dd = (Dog *)aa;//int a = (int)1.09 强制转换
[a eat]; //调用的是Dog里面的方法 eat,但不能这么用
return 0;
}
/*
继承的适用场合
1》当两个类拥有相同的属性和方法的时候,就可以将相同的东西抽取到一个父类中
2》当A类完全拥有B类部分属性和方法是,可以考虑让B类继承A类(不一定)
****student 可以继承 person student和score 只能组合
例如:
@interface Student : NSObject
{
Score *_score;
int _age; //[super walk]调用父类方法walk
} super作用:直接调用父类中的某个方 法和self想似
继承的好处:
1》抽取重复代码
2》简历了类之间的关系
3》子类可以拥有父类中的所有成员变量和方法
2.注意点
1》基本上所有的根类是NSObject
*不允许子类和父类有相同的成员变量(方法可以一样)
*父类必须声明在子类的前面
*就近原则
坏处
耦合性:之间联系太强
*/
#import <Foundation/Foundation.h>
//****Animal的声明******
@interface Animal : NSObject
{
int _age;
double _weight;
}
- (void)setAge:(int)age;
- (int)age;
- (double)setWeight:(double)weight;
- (double)weight;
@end
//Animal的实现********************
@implementation Animal
- (void)setAge
{
_age = age;
}
- (int)age
{
return _age;
}
- (double)setWeight:(double)weight
{
_weight = weight;
}
- (double)weight
{
return _weight;
}
@end
//********Dog*******
//: Animal 继承了Animal,相当于拥有了Animal里面的所有的成员变量和方法
// Animal称为Dog的父类
// Dog称为Animal的子类
@interface Dog :Animal
@end
@implementation Dog
@end
//******CAT*********8
@interface Cat :Animal
@end
@implementation CAT
@end
int main()
{
Dog *d = [Dog new];
[d setAge:10];
NSLog(@"age=%d", [d age]);
return 0;
}
封装
#import <Foundation/Foundation.h>
@interface Student : NSObject//只允许外界访问,不允许修改 值提供get方法
{ //成员变量尽量不要使用@public
// @public
int _age;成员变量的命名规范:一定要以下划线 _ 开头
}
/*set 方法
1.作用:提供一个方法给外界设置成员变量值
2.命名规范:
1》方法名必须以set开头
2》set 后面跟上成员变量的名称,成员首字母必须大写
3》返回值一定是void
4》一定要接受一个参数,而且参数类型一定要跟成员变量一致
5》形参的名称不能与成员变量名一样
*/
- (void)setAge:(int)Age;
- (void)study;
/*get方法
1.作用:返回对象内部的成员变量
2命名规范:
1》肯定又返回值,返回值肯定与成员变量类型一致
2》方法名与成员变量名一样
3.》不需要接受任何参数
*/
- (int)age;
@end
@implementation Student
//set方法的实现
- (void)setAge:(int)newAge
{
//对传进来的参数进行过滤
if (Age <= 0)
{
Age = 1;
}
_age = Age;
}
- (void)study
{
NSLog(@"%d岁的学生在学习",age);
}
- (int)age
{
return _age;
}
@end
int main()
{
Student *stu = [Student new];
[stu setAge:10];
//[stu study];
NSLog(@"学生的年龄是%d岁",[stu age]);
return 0;
}