objective C中继承、协议、分类和多态的实现

第一、objective C中继承的实现

在oc中只有实例变量会有权限控制,实例方法和类方法是没有权限控制的,这点与c++不同,OC默认的是protected,并且在声明权限控制时,没有分号

在OC中可以像C++一样用指针运算法来访问实例变量

Rectangle.h 文件代码:

#import <Foundation/Foundation.h>

@interface Rectangle : NSObject

{

int _width;

int _height;

}

@property (nonatomic,assign) int width;

@property (nonatomic,assign) int height;

-(Rectangle *) initWithWidth:(int)w AndHeight:(int)h;

-(void) print;

@end

Rectangle.m 文件代码:

#import "Rectangle.h"

@implementation Rectangle

@synthesize width=_width;

@synthesize height=_height;

-(Rectangle *) initWithWidth:(int)w AndHeight:(int)h

{

self=[super init];

if(self)

{

self.width=w;

self.height=h;

}

return self;

}

-(void)print

{

NSLog(@"the height is %d ,the width is %d",self.height,self.width);

}

@end

Square.h 文件代码:

#import "Rectangle.h"

@interface Square : Rectangle

{

int _d;

}

-(Square *)initSquareWithwidth:(int)w AndHeight:(int)h Andval:(int)d;

@property (nonatomic,assign)int d;

@end

Square.m 文件代码:

#import "Square.h"

@implementation Square

@synthesize d=_d;

-(Square*)initSquareWithwidth:(int)w AndHeight:(int)h Andval:(int)d

{

self=[super init];

if(self)

{

self.height=h;

self.width=w;

self.d=d;

}

return self;

}

-(void)print //实现重载

{

NSLog(@"the d is %d,the width is %d,the height is %d",self.d,self.width,self.height);

}

@

main函数:

#import <Foundation/Foundation.h>

#import "Access.h"

#import "Rectangle.h"

#import "Square.h"

int main(int argc, const char * argv[])

{

@autoreleasepool {

Rectangle *test=[[Rectangle alloc] init];

[test initWithWidth:3 AndHeight:4];

[test print];

Square *squareObj=[[Square alloc] init];

[squareObj initSquareWithwidth:3 AndHeight:4 Andval:5];

[squareObj print];

}

return 0;

}

第二、objective C 协议的实现

在OC中不可以实现多重继承,因为是实现多重继承代价太大,但OC可以实现多个协议,协议类似于C++中的纯虚类,只有方法定义,没有方法实现,只有.h文件,没有成员变量。

协议(protocal)与Java的interface(接口)和C++的纯虚类相同,协议只负责方法的列表,不负责方法的实现,目的是让别的类来实现,协议只有接口部分,没有m文件,关键字是protocol,协议可以继承别的协议,协议中不能定义别的成员变量。

协议本身不是类,它是定义了一个其他类可以实现的接口

协议可以被任何类去实现

协议的关键字:

@required:表示必须强制实现的方法

@optional:表示可以有选择性实现的方法

Graphics.h file

#import <Foundation/Foundation.h>

@protocol Graphics

-(void) onDraw;

@end

Ellipse 类的实现

#import <Foundation/Foundation.h>

#import "Graphics.h"

@interface Ellipse:NSObject <Graphics>

@end

#import "Ellipse.h"

@implementation Ellipse

-(void)onDraw

{

NSLog(@"draw ellipse");

}

@end

Triangle类的实现

#import <Foundation/Foundation.h>

#import "Graphics.h"

@interface Triangle : NSObject <Graphics>

@end

#import "Triangle.h"

@implementation Triangle

-(void)onDraw

{

NSLog(@"draw triangle");

}

@end

main函数的实现

int main(int argc, const char * argv[])

{

@autoreleasepool {

id test;

test=[[Ellipse alloc] init];

[test onDraw];

[test release];

test=[[Triangle alloc]init];

[test onDraw];

[test release];

}

return 0;

}

the resutl is:

draw ellipse

draw triangle

objective C的继承是单一继承,但是可以实现多个协议,用,分割

第三、objective-C中分类的实现

分类机制允许向一个类文件中添加新的方法声明,它不需要使用子类机制,并且在类实现的文件中的同一个名字下定义这些方法。

定义方法:

#interface 类名(分类标示)  只要分类标示,就可以添加不同的分类方法

分类机制的缺点:

1. 不能添加属性,只能添加方法

2. 名称冲突,如果类别中方法与现有的方法重名,当发生名称冲突时,类别具有更高的优先级

分类机制的好处:

1.将类的实现分散到多个不同文件或多个不同框架中去实现

2.创建对私有方法的前向引用

3.面向对象添加非正式协议

#import “ClassName.h”

@interface ClassName (CategoryName)

@end

Vector.h 代码

#import <Foundation/Foundation.h>

@interface Vector : NSObject

{

double _vec1;

double _vec2;

}

@property (nonatomic,assign) double vec1;

@property (nonatomic,assign) double vec2;

-(Vector *)add:(Vector *)v;

-(void)setVec1:(double)vec1 AndVec2:(double)vec2;

-(void)print;

@end

Vector.m 代码

#import "Vector.h"

@implementation Vector

@synthesize vec1=_vec1;

@synthesize vec2=_vec2;

-(void)print

{

NSLog(@"v1 value is %f,v2 value is %f",self.vec1,self.vec2);

}

-(void)setVec1:(double)vec1 AndVec2:(double)vec2

{

self.vec1=vec1;

self.vec2=vec2;

}

-(Vector*)add:(Vector *)v

{

Vector *vector=[[Vector alloc]init];

vector.vec1=v.vec1+self.vec1;

vector.vec2=v.vec2+self.vec2;

return vector;

}

@end

vector+sub.h 代码

#import <Foundation/Foundation.h>

#import "Vector.h"

@interface Vector(sub)

-(Vector *)sub:(Vector *)v;

@end

vector+sub.m code

#import "Vector+sub.h"

@implementation Vector (sub)

-(Vector *)sub:(Vector *)v

{

Vector *temp=[[Vector alloc ]init];

temp.vec1=self.vec1-v.vec1;

temp.vec2=self.vec2-v.vec2;

return temp;

}

@end

main code:

int main(int argc, const char * argv[])

{

@autoreleasepool {

Vector *test1=[[Vector alloc]init];

[test1 setVec1:2.2 AndVec2:3.4];

[test1 print];

Vector *test2=[[Vector alloc]init];

[test2 setVec1:1.1 AndVec2:1.2];

Vector *ret=[test1 sub:test2];

[ret print];

[test1 release];

[test2 release];

}

return 0;

}

result:

2013-05-06 17:38:34.751 Access[2057:303] v1 value is 2.200000,v2 value is 3.400000

2013-05-06 17:38:34.753 Access[2057:303] v1 value is 1.100000,v2 value is 2.200000

如果想给类通过分类添加更多的函数,sample:

NSString+Utilities.h

#import <Foundation/Foundation.h>

@interface NSString(Utilities)

-(BOOL)isURL;

@end

#import "NSString+Utilities.h"

@implementation NSString(Utilities)

-(BOOL)isURL

{

if ([self hasPrefix:@"http"])

{

return TRUE;

}else

{

return FALSE;

}

}

@end

这样就可以添加很多函数

分类是C++没有的概念,分类的使用是通过Objective-C的动态绑定实现,通过分类能够实现比继承更好的效果

第四、objective c中多态的实现

动态类型:OC在运行时才确定对象的实际类型,如 id car,此时只有在执行到该语句时,我们才知道其实际类型

动态绑定:程序在执行时才确定对象调用的实际方法

在编译时就能确定的类型是静态类型,如 student *stu;这就是一个静态类型

Graphics.h 文件代码:

#import <Foundation/Foundation.h>

@interface Graphics : NSObject

-(void) onDraw;

@end

Graphics.m 文件代码:

#import "Graphics.h"

@implementation Graphics

@end

Triangle.h 代码:

#import "Graphics.h"

@interface Triangle : Graphics

@end

Triangle.m 代码:

#import "Triangle.h"

@implementation Triangle

-(void)onDraw

{

NSLog(@"draw triangle");

}

@end

Ellipse.h 代码:

#import "Graphics.h"

@interface Ellipse : Graphics

@end

Ellipse.m 代码:

#import "Ellipse.h"

@implementation Ellipse

-(void)onDraw

{

NSLog(@"draw ellips");

}

@end

main 函数:

int main(int argc, const char * argv[])

{

@autoreleasepool {

Graphics *graphics;

graphics=[[Ellipse alloc] init];

[graphics onDraw];

[graphics release];

graphics=[[Triangle alloc] init];

[graphics onDraw];

[graphics release];

id test;

test=[[Ellipse alloc] init];

[test onDraw];

[test release];

test=[[Triangle alloc] init];

[test onDraw];

[test release];

}

return 0;

}

输出结果:

2013-05-05 19:25:05.941 Access[966:303] draw ellips

2013-05-05 19:25:05.943 Access[966:303] draw triangle

2013-05-05 19:25:05.944 Access[966:303] draw ellips

2013-05-05 19:25:05.944 Access[966:303] draw triangle

id 类型属于ios常用的三大类型之一,其他包括:基本类型和对象类型,id类型可以代表任意的对象类型,该类型常用来实现多态

时间: 2024-08-07 17:01:02

objective C中继承、协议、分类和多态的实现的相关文章

【Java基本功】一文了解Java中继承、封装、多态的细节

本节主要介绍Java面向对象三大特性:继承 封装 多态,以及其中的原理. 本文会结合虚拟机对引用和对象的不同处理来介绍三大特性的原理. 继承 Java中的继承只能单继承,但是可以通过内部类继承其他类来实现多继承. public class Son extends Father{public void go () {System.out.println("son go");}public void eat () {System.out.println("son eat"

分类 类扩展 继承 协议 委托

分类 类扩展 继承 协议 委托 分类(Category) 不产生新类,不修改原类,但有自己的.h和.m文件 分类只能向原类中增加方法,或者重写原类的方法 声明的@property只会生成getter setter方法的声明 类.h中定义的方法必须实现,但分类.h中定义的方法,可以不实现 同名方法,分类的优先级高类别主要有3个作用:(1)将类的实现分散到多个不同文件或多个不同框架中.(2)创建对私有方法的前向引用.(类.h中未声明,但存在于.m中的私有方法,通过在分类.h中声明一下,就可以在其他类

Java中的继承、封装、多态的理解

Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类称为父类(有的也称其为基类.超类),父类和子类的关系,是一种一般和特殊的关系.就像是水果和苹果的关系,苹果继承了水果,苹果是水果的子类,水果是苹果的父类,则苹果是一种特殊的水果. 3.Java使用extends作为继承的关键字,extends关键字在

c语言中继承和多态的简单实现

C语言本身是不支持继承和多态的,但其实在 C 的世界里,有一套非常有名的面向对象的框架,用的也非常广,那就是 GObject,它是整个图形界面开发库 GTK 的基石,在IBM developerWorks上有一篇很好的文章介绍 GObject<GObject对象系统>.另外,在 Linux 内核里面也大量使用了面向对象的思想,比如虚拟文件系统,设备驱动等模块,在 lwn上有两篇文章就讲到了内核中的面向对象,详细请看:<Object oriented design patterns in

Objective中的协议(Protocol)

作用: 专门用来声明一大堆方法. (不能声明属性,也不能实现方法,只能用来写方法的声明). 只要某个类遵守了这个协议.就相当于拥有这个协议中的所有的方法声明. 协议的声明: @protocol 协议名称 <NSObject> //方法的声明; @end 新建1个协议的方式. NewFile OC-File - protocol 协议的文件名: .h 并且只有1个.h文件. 在协议中,只能用来声明方法,协议的作用:就是专门用来写方法声明的. 类遵守协议: 如果想要让1个类,拥有协议中定义的所有的

Java中的继承、封装、多态

继承 所谓封装,就是将对象的成员变量和成员函数包装和隐藏起来,对外界通过特定的接口来访问. public class User { private String name; public User (String name) { this.name = name; } public String getName () { return this.name; } public void sayName () { System.out.println(this.getName()); } publi

面向对象的三大基石(封装,继承和复合,多态)

转自 面向对象的三大基石面向对象的三大基石(封装,继承和复合,多态) 三大基石之一 封装 1.什么是封装? 封装(encapsulation)又叫隐藏实现(Hiding the implementation).就是只公开代码单元的对外接口,而隐藏其具体实现. 比如你的手机,手机的键盘,屏幕,听筒等,就是其对外接口.你只需要知道如何按键就可以使用手机,而不需要了解手机内部的电路是如何工作的.封装机制就像手机一样只将对外接口暴露,而不需要用户去了解其内部实现.细心观察,现实中很多东西都具有这样的特点

(转)面向对象的三大基石(封装,继承和复合,多态)

三大基石之一 封装 1.什么是封装? 封装(encapsulation)又叫隐藏实现(Hiding the implementation).就是只公开代码单元的对外接口,而隐藏其具体实现. 比如你的手机,手机的键盘,屏幕,听筒等,就是其对外接口.你只需要知道如何按键就可以使用手机,而不需要了解手机内部的电路是如何工作的.封装机制就像手机一样只将对外接口暴露,而不需要用户去了解其内部实现.细心观察,现实中很多东西都具有这样的特点. 2.如何实现封装?            在程序设计里,封装往往是

继承、final、多态、内部类、异常

继承(上): 1. 提高了代码的重用性 2. 让类与类之间产生关系,有了这个关系,才有多态性 注意:千万不要为了获取其他功能,简化代码而继承: 必须是类与类之间有所属关系才可以继承,所属关系 is a. 在java语言中只能是单继承,不支持多继承. 因为:多继承容易带来安全隐患,当多个父类有相同的功能, 当功能内容不同时,子对象不确定运行哪一个. 但是java保留这种机制,用另一种形式表示:多实现. 并且存在多层继承,也就是一个继承体系. 如何使用一个继承体系中的功能? 要想使用体系,先查阅体系