专栏首页菩提树下的杨过objective-C 的OOP(上)--类定义、继承及方法调用

objective-C 的OOP(上)--类定义、继承及方法调用

上一篇展示了如何用传统的“面向过程编程方法”,实现画“矩形”、“圆”、“椭圆”,这一篇看下如何改用OOP的方法来实现:

因为要用到“颜色”以及“矩形区域”二个枚举,先把他们抽出来单独放在CommDef.h文件中

//定义“几何形状颜色”枚举
typedef enum
{
	kRedColor,
	kGreenColor,
	kBlueColor
} ShapeColor;

//定义“几何形状矩形区域”结构
typedef struct
{
	int x,y,width,height;
} ShapeRect;

然后再定义基类Shape,注意:在obj-C中,定义一个类通常分成二部分,一部分是".h"的文件,用来申明类有哪些成员(也称为类的定义文件,类似于接口),另一部分是".m"的文件,用来提供具体实现

Shape类的申明部分如下:(Shape.h)

//
//  Shape.h
//  HelloWorld
//
//  Created by jimmy.yang on 11-1-26.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import "CommDef.h"

@interface Shape : NSObject {
	ShapeColor fillColor;
	ShapeRect bounds;	
}

- (void) setFillColor:(ShapeColor) fillColor;
- (void) setBounds:(ShapeRect) bounds;
- (void) draw;
- (NSString*) getColorName:(ShapeColor) fillColor;

@end //Shape

Shape类的实现部分如下:(Shape.m)

//
//  Shape.m
//  HelloWorld
//
//  Created by jimmy.yang on 11-1-26.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "Shape.h"


@implementation Shape

- (void) setBounds:(ShapeRect)b
{
	bounds = b;
}

- (void) setFillColor:(ShapeColor)f
{
	fillColor =f;
}

//注:这个方法留给子类去实现,所以这里只要一个空壳就行了
- (void) draw
{
	
}


- (NSString*) getColorName:(ShapeColor)f
{
	
	switch (f) {
		case kRedColor:
			return @"red";
			break;
		case kGreenColor:
			return @"green";
			break; 
		case kBlueColor:
			return @"blue";
			break; 
		default:
			return @"no clue";
			break;
	}
	
}

@end

语法有点奇怪,初次接触,只能强迫自己忘记吧。

然后定义子类Circle

申明部分Circle.h

//
//  Circle.h
//  HelloWorld
//
//  Created by jimmy.yang on 11-1-26.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "Shape.h"
//注:因为Circle类不需要扩展其它方法,所以这里也只要一个空壳
@interface Circle : Shape {

}

@end

实现部分Circle.m

//
//  Circle.m
//  HelloWorld
//
//  Created by jimmy.yang on 11-1-26.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "Circle.h"


@implementation Circle

-(void) draw
{
	NSLog(@"drawing a Cirle at (%d,%d,%d,%d) in %@",bounds.x,bounds.y,bounds.width,bounds.height,[super getColorName:fillColor]);
}
@end

注:上面展示了在obj-C中如何调用父类的方法[super getColorName:fillColor]

子类Rectangle

//
//  Rectangle.h
//  HelloWorld
//
//  Created by jimmy.yang on 11-1-26.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import "Shape.h"

@interface Rectangle : Shape {

}

@end

实现部分

//
//  Rectangle.m
//  HelloWorld
//
//  Created by jimmy.yang on 11-1-26.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "Rectangle.h"


@implementation Rectangle
-(void) draw
{
	NSLog(@"drawing a Rectangle at (%d,%d,%d,%d) in %@",bounds.x,bounds.y,bounds.width,bounds.height,[super getColorName:fillColor]);
}
@end

子类Ellipse

//
//  Ellipse.h
//  HelloWorld
//
//  Created by jimmy.yang on 11-1-26.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//


#import "Shape.h"

@interface Ellipse : Shape{

}
@end

实现部分

//
//  Ellipse.m
//  HelloWorld
//
//  Created by jimmy.yang on 11-1-26.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "Ellipse.h"


@implementation Ellipse
-(void) draw
{
	NSLog(@"drawing a ellipse at (%d,%d,%d,%d) in %@",bounds.x,bounds.y,bounds.width,bounds.height,[super getColorName:fillColor]);
}
@end

最后看下调用的主函数HelloWorld.m

#import "CommDef.h"
#import "Circle.h"
#import "Rectangle.h"
#import "Ellipse.h"

int main (int argc, const char * argv[]) {    
	
	id shape[2] ;
	
	ShapeRect rect0 =  {0,0,10,30};
	shape[0] = [Circle new];
	[shape[0] setBounds:rect0];
	[shape[0] setFillColor:kGreenColor];
	[shape[0] draw];	
	
	ShapeRect rect1 =  {0,0,40,50};
	shape[1] = [Rectangle new];
	[shape[1] setBounds:rect1];
	[shape[1] setFillColor:kRedColor];
	[shape[1] draw];

	
	ShapeRect rect2 =  {0,0,30,30};
	shape[2] = [Ellipse new];
	[shape[2] setBounds:rect2];
	[shape[2] setFillColor:kBlueColor];
	[shape[2] draw];

	
    return 0;
}

注:上面的代码中有一个id的变量,在obj-C中id相当于“任意类型”,意为指向某对象的指针(哪怕你不知道这个对象是什么类型),总之,如果你不知道某对象的具体类型时,用它就对了。同时我们也看到了,创建一个类的实例用“[类 new]”来完成。

最后附上文件结构图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • "RDLC"报表-参数传递及主从报表

    今天继续学习RDLC报表的“参数传递”及“主从报表” 一、先创建DataSet,如下图: ? 二、创建一个报表rptDEPT.rdlc,显示部门T_DPET的数...

    菩提树下的杨过
  • “AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (下)

    在前一部分的最后,我们给出了一个寻路的示例,在大多数情况下,运行还算良好,但是有一个小问题,如下图: ? 很明显,障碍物已经把路堵死了,但是小球仍然穿过对角线跑...

    菩提树下的杨过
  • “AS3.0高级动画编程”学习:第三章等角投影(下)

    在上一篇的最后,我们成功的用“等角投影”模拟出了立体空间的盒子模型,但是很快你就会发现这个示例的bug ? bug1:在已经有box的地方,再点击,将会重复创建...

    菩提树下的杨过
  • 双指针-two pointers

    概念:two pointers广义上概念就是利用问题本身与序列的特性,利用下标i、j对序列进行扫描,以较低的复杂度来解决问题,其实也不太像是一种算法,说来可以看...

    lollipop72
  • 最大子序列和O(N)算法简单分析『神兽必读』

    可以看到算法中重要的位置都标注出来了。 显然这个算法有一个for循环,整体时间复杂度可以看作O(N)。 就算法正确性来分析,首先假设这样的输入:-2, -3, ...

    用户3579639
  • 解密600年前的秘密,科学家利用AI成功破译“伏尼契手稿”第一句

    唐旭 编译整理 量子位 出品 | 公众号 QbitAI 1912年,一份残余240页、从头至尾由未知文字与奇异插图写成的手稿在罗马附近的一所耶稣会大学图书馆中被...

    量子位
  • 域名Whois 查询系统,基于ThinkPHP+Mysql

    基于Thinkphp+mysql 开发的,后台管理Whois服务器信息,还有域名查询记录,有效的缓存查询记录 域名查询了第一次就会缓存到数据库里面,如果有数据库...

    Alone88
  • 数控CNC加工中出现的工件过切,分中问题,对刀问题,撞机,编程这些问题如何解决?

    数控CNC加工中出现的工件过切,分中问题,对刀问题,撞机,编程这些问题如何解决?

    UG数控编程
  • 网络远程唤醒 WOL Magic Packet

    转自:https://www.cnblogs.com/dcb3688/p/4608063.html

    用户3033338
  • 网络远程唤醒 WOL Magic Packet

      The basic technical details of Magic Packet Technologyare simple and easy to u...

    用户3033338

扫码关注云+社区

领取腾讯云代金券