OC基础——封装、继承、多态

时间:2021-05-25 21:55:00




一. 成员变量的封装      优点:外界无法随意修改类中成员变量的值,把内部变量隐藏起来,提高了程序的安全性。     1、 set方法  作用:1> 提供一个方法给外界用来设置成员变量值;           2> 可以在方法里面过滤掉一些不合理的值。  命名规范:1>  方法名必须以set开头;                 2>  et后面跟上成员变量的名称,成员变量的首字母必须大写;                 3>  返回值一定是void;                 4>  一定要接收一个参数,而且参数类型跟成员变量类型一致;    eg:         -(void)setAge:(int)age        {             _age=age;        }    方法调用时和普通方法调用一样:[执行者  方法]      eg:[p setAge:10];
2、get方法 作用:返回对象内部的成员变量。 命名规范:1> 肯定有返回值,返回值类型肯定和成员变量的类型一致。                2> 方法名跟成员变量名一致。                3> 不需要接收任何参数。  eg:   -(int)age   {          return _age;   }  方法调用和普通方法调用一样:[执行者 方法]; eg: int age = [ p age]; 3、弱语法 1> 在C语言中,随便调用一个函数,只要语法对,编译器只会警告,不会报错,只是在链接的时候报错; 2> 在OC语言中,随便调用一个方法,编译器只会警告,不会报错,也可以链接成功,只是在运行时发生错误,经典错误信息如下: OC基础——封装、继承、多态
提示错误:指针并未找到相应的方法(给对象Person发送了一个不能识别的方法test() 3> 一旦程序在运行中出错,就会闪退。 4、类方法(类调用、”+“开头、不能访问成员变量) 1、方法分为两种:对象方法和类方法 对象方法:1> 减号“-”开头;                 2> 只能由对象来调用;                 3> 对象方法中能访问当前对象的额成员变量。 类方法: 1> 以加号”+“开头;               2> 只能由类来调用;               3> 类方法中不能访问成员变量。 2、类方法的好处 1> 不依赖于对象,执行效率高; 2> 能用类方法,尽量用类方法; 3、 使用场合:当方法内部不需要使用到成员变量的时候,就可以改为类方法。 4、 在一个类中不可以同时存在两个同名的类/对象方法,但是可以同时存在同名类方法和对象方法。  eg:-(viod)test;         +(viod)test; // 可以 
5、self关键字 1. self是一个指针,指向调用当前方法的对象,即方法调用者。谁调用了方法,self就指向谁。看self所处的当前环境: self出现在对象方法中,self就代表对象; self出现在类方法中,self就代表类。 2. self的用途:     1>可以利用”self ->成员变量名“访问当前对象内部的成员变量;     2>[self 方法名]可以调用其他对方法或类方法。 3. self容易引发死循环。
二、继承(英文:) 1、若类A继承类B,则B拥有A的所有东西(成员变量及方法)。此时称:类A是类B的父类,类B是类A的子类。 特点:子类一旦继承了父类,则子类拥有父类中所有的成员变量和方法。 优点:1>抽取重复代码;           2>建立类之间的关系;           3>子类拥有父类中所有属性和方法。 缺点:耦合性强(父类的改变会影响到子类,如果一个类丢失,另外一个类也将不能使用)。
2、注意点:1> 基本上所有类的根类是NSObject;                   2> 子类和父类不能定义相同的成员变量;                   3> 允许子类和父类有相同的方法,调用某个对象的方法时,会优先调用子类的方法,然后再去父类中找。(一层一层往上找)                   4> 父类必须申明在子类前面(只要申明在前就可以了,方法可以写在后面)                   5> 每个类中都有一个superclass指针,指向自己的父类。 eg:@interface Student:Person OC基础——封装、继承、多态

3、组合与继承 继承:xxx是xx,比如student是person(同一种类型范畴); 组合:xxx拥有xx,比如student拥有Score
@interface Student :NSObject
{
Score *_Score;//Score是另外一个类,Student类与Score类组合,Student拥有Score类的成员
}@end

4、Super关键字 作用:1> 可以直接调用父类中的方法;           2> 如果super处在对象方法中,就会调用父类的对象方法;                如果super处在类方法中,就会调用父类中的类方法。 使用场合:子类重写父类的方法时想保留父类的一些行为。(子类可以直接调用父类的某个方法[super 方法名]) eg:在重写父类的基础上,再保留父类的方法:
-(void)walk //重写父类的walk方法
{
NSLog("往前走几步");
[super walk]; //调用父类的walk方法
}

三、多态(多种形态,父类指针指向子类对象
1、概念:某一类事物的多种形态。比如狗可以有多个形态,一是以狗的形式存在,二是以动物的形式存在。 2、条件:一定要有继承,没有继承就没有多态。 eg:Animal *a = [dog new]; // Animal是父类,dog是子类,狗是动物。        Dog *d = [Animal new]; //错误,因为动物不一定是狗也可能是猫。 3、优点:节省代码,提高效率。 eg:
//如果方法或函数参数中使用的是父类类型,则可以通过父类指针传入父类和子类对象。
viod feed(Animimal *a) //定义喂动物的函数
{
[a eat];
}
// 解析:上述函数的形参是父类Animal,所以函数可以传入父类和子类。这样的话狗和猫都能使用feed函数,节省代码。
4、局限性:父类类型的指针不能调用子类的方法(必须将父类指针强制转换为子类指针时才能调用子类中的方法)。
eg:
//Dog有一个run方法
int main()
{
Animal *a = [Dog new];
[a run];//编译时会警告,但是可运行,不建议这样写。
Dog *d = (Dog*)a;// 将父类指针a强制转换成子类指针d
[d run];
}
总之:1> 没有继承就没有多态;
           2> 代码体现:父类类型的指针指向子类对象;eg:Animal *a = [Dog new];            3> 好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象;            4> 局限性:父类类型的变量,不能直接调用子类特有的方法。必须强制转换为子类类型变量后,才能直接调用子类特有的方法。
四、OC字符串
1、创建OC字符串的方法
1> NNString *str = @"itcoast";// oc字符串以@开头 2> NNString *str = [NSString stringWithFomat:@"my age is %d,number is %d",age,no];
2、长度算法:[str length]// 直接调用NSObject中的length方法,length方法计算的是字数(包括空格),并不是字符数。       eg: “哈哈Jack”字数为6个字(汉字和字母一样都算一个字)       占位符:%@