OC学习之面向对象三大特征

来源:互联网 发布:c4dr18软件在哪里下载 编辑:程序博客网 时间:2024/05/08 23:42

一、继承性                                                                                                         

继承性是指,在某种情况下,一个类下面会有一个子类,这个子类理论上来说会比之前的类(父类)具体化。比如还是“狗”这个类,假设它里面有一个成员变量是身高和体重,有一个方法是咬人。然后再假设这个“狗”类中有“哈士奇”和“金毛”这两种狗,这两种狗除了继承其父类中的成员和方法外,还有自己添加的一些,比如在“哈士奇”这个狗的类中添加了打滚的行为,在“金毛”这个狗的类中添加了卖萌这个行为,这些都是其父类所不具有的,而子类之间所独有的行为和属性是不能相互用的,就比如“哈士奇”不能卖萌,因为这是“金毛”私有的。

1.继承的好处                                                                                         

1.抽取重复代码

2.建立了类之间的关系

子类可以拥有父类中的所有成员变量和方法

基本上所有的根类都是NSObject

注意:

1.父类必须声明在子类前面

2.不允许子类和父类有相同名称的成员变量

3.调用某个方法时,优先去当前类中找,如果找不到就会去父类中找

重写:子类重新实现父类中的某个方法,用来覆盖父类中以前的做法

每个对象里默认有个isa指针,指向自己的类,自己的类里默认也有个supercalss指针,这个指针又指向父类,父类用也有个supercalss指针,这个指针又指向NSObject类

坏处:

耦合性太强,即两个类的关系太紧密,如果父类损坏,子类就用不了

继承的使用场合:

 1.当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中

 2.A类拥有B类中的部分属性和方法时,可以考虑让B类继承A

组合:

和继承的区别是,继承是全部拥有,而组合是部分拥有.

基本用法

2.self和super                                                                                                          

self是一个指针,指向当前对象

self->成员变量

访问当前对象内部的成员变量

[self 方法名];

可以调用其他类或者方法

self如果出现在对象方法中,self就代表对象

self如果出现在类方法中,self就代表类

[super 方法名];

直接调用父类中的方法

调用的方法不仅限于对象方法,类方法也可以

如果super处在对象方法中,那么就会调用父类的对象方法

如果super处在类方法中,那么就会调用父类的类方法

使用场合:子类重写父类的方法时想保留父类的一些行为 

二、封装性                                                                                                                 

封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫接口。具备封装性的程序是隐藏了某一方法的具体执行步骤,取而代之的是通过消息传递机制传送给它。比如说,“狗”这个类中有“吠”这个方法,这个方法定义了狗具体应该如何吠,但是外人并不需要知道它是如何吠的。

封装是通过限制只有特定类的实例可以访问这一特定类的成员,而他们通常利用接口实现消息传递。通常来讲,成员会根据他们的访问权限被分为三种:公有成员(public),私有成员(private),保护成员(protected)。

1.作用域                                                                                                                 

下面还要在说一下作用作用域类型:

@public在任何地方都可以访问对象的成员变量
@private(在类的实现中默认)只能在当前类的对象方法中直接访问
@protected(在类的声明中默认)能在当前类和子类的对象中直接访问
@package只要出于同一个框架中就能直接访问对象的成员变量

  如何访问:

@public可以用指针,箭头和变量名直接访问,比如:p->_age = 10;

@private在当前类对象方法中,用变量名访问_height = 90;在其子类中可以用setget方法访问,或者点语法

@protected能在当前类和子类的对象方法中直接用变量名访问_weight = 100;

:.m文件中的变量默认就是@private(私有)

2.封装的用法                                                                                                           

为了防止在主函数里给属性不规范的赋值

所以去掉@public

然后可以在一个方法里给成员变量赋值

这时就用到了set方法

作用:提供一个方法给外界设置成员变量值,可以在方法里对参数进行相对应的过滤

命名规范:

1.方法名必须以set开头

2.set后面跟上成员变量的名称,成员变量的首字母必须大写

3.返回值一定是void

4.一定要接收一个参数,而且参数类型跟成员变量类型一致

5.形参名称不能和成员变量一样

 

get方法

作用:返回对象内部的成员变量

命名规范:

1.有返回值,返回值类型与成员变量类型一致

2.方法名跟成员变量名一样

3.不需要接收任何参数

 

成员变量的命名规范

1.一定要以下划线 _ 开头

2.可以跟局部变量区分开,一看到下划线开头的变量,一半都是成员变量

类方法:以+开头

其好处:

不用创建对象,直接执行行为

类方法只能用类调用

OC弱语法体现

比如,没有定义一个方法,但是却可以调用这个方法,编译也可以通过

3.封装的好处                                                                                                          

1.过滤不合理的值

2.屏蔽内部的赋值过程

3.让外界不必关注内部的细节

三、多态性                                                                                                                 

利用多态创建对象时,调用方法时会检测对象的真实对象,调用真实地对象方法

个人理解:

利用其它的类来创建对象

比如

A  *a = [B  do];

其实真正的类还是B

1.多态总结                                                                                                              

1.没有集成就没有多态

2.代码的体现:父类类型的指针指向子类对象

3.好处:如果函数/方法参数中使用的是父类类型,可以传入父类,子类对象

4.局限性:父类类型的变量不能直接调用子类特有的方法,如果想用,必须强制换位子类类型变量后,才能直接调用

2.多态的局限性                                                                                                        

父类类型的变量不能用来调用子类的方法  

如果想这么多,可以利用类型强制转换

例子:

A是父类,D是子类,run是子类方法

A *aa = [D new];D *dd =(D *)aa;      // 将aa转为D *类型的变量[dd run];


3.多态的好处                                                                                                           

?

如果参数中使用的是父类类型,可以传入父类,子类对象,可以节省代码

void feed(Animal ×a) // 在动物类中创建一个喂食feed()方法{    [a eat];    } int main(){    Dog *dd = [Dog new];    // 创建一个狗对象    feed(dd);               // 喂狗          Cat *cc = [Cat new];    // 创建一个猫对象    feed(cc);               // 喂猫 }// 可以看出不同的对象可以使用同一个类方法


4.多态使用实例                                                                                                       

?
//例子:#import <Foundation/Foundation.h>    @interface Animal : NSObject- (void)eat;@end  @implementation Animal- (void)eat{    NSLog(@"Animal---Eating something!!");}@end  @interface Dog : Animal@end  @implementation Dog- (void)eat{    NSLog(@"Dog--Eating something!!");}@end  int main(){    //多种形态  //  Dog *d = [Dog new];     //Dog类型    Animal *a = [Dog new];  //调用一个对象方法时,调用的是真实对象方法   // NSObject *n = [Animal new];    [a eat];    return 0;}// 输出结果为:Dog--Eating something!!



0 0
原创粉丝点击