【Objective-C编程】浅析Objective-C的继承与复合

来源:互联网 发布:矩阵的秩的意义 编辑:程序博客网 时间:2024/04/28 15:27

OOP关于类和对象包含两个主要方面,继承和复合(composition)。继承可以定义一个具有父类所有功能的新类。复合中,对象可以引用其它对象。


1. 继承(is-a关系)

如    @interface YourObject:NSObject        {             …………             …………        }       @end

冒号后的标示符是需要继承的类。必须注意的是,在Objective-C中每个子类只能有一个超类,这一点与c++不同。也就是说objective-c不支持多继承。若需要改变父类某函数的实现,则需要重写方法。Objective-c支持重写方法,同时仍然调用超类的实现方式。这时需要使用super关键词来调用父类方法。如:

 [super init];
  


2. 复合(has-a关系)

    objective-c中,复合是通过包含作为实例变量的对象指针实现的。例如,使用一个Pedal(脚踏板)对象和一个Tire(轮胎)对象组合出虚拟的独轮车。此时应该拥有一个指向Pedal对象的指针和一个指向Tire对象的指针

 @interface Unicycle: NSObject       {            Pedal *pedal;            Tire *tire;        }        @end

Pedal和Tire通过复合的方式组成了Unicycle,严格来讲,只有对象间的组合才能叫复合,而基本类型都被认为是对象的一部分。

 

    像新手的话一般继承复合傻傻分不清楚,对任何东西都想要进行继承的思想来写。继承的确是个好东西,不过我们就当根据情况来定, 不可以对什么都盲目使用继承,例如用Unicycle类继承Tire类,但是这样逻辑是不对的,难道独轮车是轮胎?

一般继承用于is a(是一个)的关系,例三角形是一个形状,汽车是一种交通工具。这样的情况使用继承绝对的ok

一般复合用于has-a(有一个)的关系,例如汽车有一个引擎和四个轮子,形状有一个填充颜色。这样的情况使用复合绝对的ok




既然说到OOP范畴的继承与复合。接下来就顺便把面向对象的专业名词带过一下:

1.self 与 super
a) self 是一个隐含的指针,指向接收消息的对象的指针。
b)super既不是参数也不是实例变量。向super发消息时,实际上是在请求Objective-C向该类的超类发送消息。如果超类中没有定义的消息,Objective-C将按照继承的通常规则在继承链中查找。例如[super init] 用于向超类的init方法发送消息。

2.NSObject
每个类都是NSObject的子类,而NSObject中定义了isa实例变量,所以每个类的对象(实例)第一实例变量就是isa,不过它是隐藏的。即为第一点已经提到的隐藏的Self.

3.方法调度
 当一个对象接收到一个消息后,调度程序会在接收对象的类中查找与该消息对应的方法,如果没有找到调度程序就进入超类中查找,如还是没有则根据继承规则继续向上游查找,如果到类继承关系的最顶层(NSObject类)还没有找到该消息的方法时就会报错

4.接口(interface) 
是类为对象提供的特征描述。简言之接口有声明就可以进行接收外部发送的消息

5.实现(implementation) 
对接口的实现。


1 0