黑马程序员技术交流社区
标题:
一道Objective-C作业题
[打印本页]
作者:
Harvey_ios
时间:
2015-5-9 17:07
标题:
一道Objective-C作业题
之前我发了一个帖子
一道作业题引发的思考
,今天的作业题是在上次题目基础上实现的,题目如下:
/**
6.设计一个类Circle,用来表示二维平面中的圆
1> 属性
* double radius (半径)
* Point2D *point (圆心)
2> 方法
* 属性相应的set和get方法
* 设计一个对象方法判断跟其他圆是否相交(重叠返回YES,否则返回NO)
* 设计一个类方法判断两个圆是否相交(重叠返回YES,否则返回NO)
*/
复制代码
我的思路是:设计一个Circle类继承Point2D,因为圆心也是一个点,Circle类通过继承可以使用父类中的实例变量和方法。
我的代码如下:
#import <Foundation/Foundation.h>
#import <math.h>
// 点
@interface Point2D : NSObject
{
double _x; // x值
double _y; // y值
}
// x值的getter和setter
- (void)setX:(double)x;
- (double)x;
// y值的getter和setter
- (void)setY:(double)y;
- (double)y;
// 同时设置x和y
- (void)setX:(double)x andY:(double)y;
// 计算跟其他点的距离
- (double)distanceWithOther:(Point2D *)other;
// 计算两个点之间的距离
+ (double)distanceBetweenPoint1:(Point2D *)p1 andPoint2:(Point2D *)p2;
@end
@implementation Point2D
// x值的getter和setter
- (void)setX:(double)x
{
_x = x;
}
- (double)x
{
return _x;
}
// y值的getter和setter
- (void)setY:(double)y
{
_y = y;
}
- (double)y
{
return _y;
}
// 同时设置x和y
- (void)setX:(double)x andY:(double)y
{
// 第1种思路
// _x = x;
// _y = y;
// 第2种思路
[self setX:x];
[self setY:y];
}
// 计算跟其他点的距离
- (double)distanceWithOther:(Point2D *)other
{
// 不要再傻乎乎算一遍了,直接调用类方法即可
return [Point2D distanceBetweenPoint1:self andPoint2:other];
}
// 计算两个点之间的距离
+ (double)distanceBetweenPoint1:(Point2D *)p1 andPoint2:(Point2D *)p2
{
// 两点距离公式:( (x1-x2)的平方 + (y1-y2)的平方 )开根
// x1-x2
double xDelta = [p1 x] - [p2 x];
// (x1-x2)的平方
double xDeltaPingFang = pow(xDelta, 2);
// y1-y2
double yDelta = [p1 y] - [p2 y];
// (y1-y2)的平方
double yDeltaPingFang = pow(yDelta, 2);
return sqrt(xDeltaPingFang + yDeltaPingFang);
}
@end
// Circle类 继承Point2D
@interface Circle : Point2D
{
double _radius; // 半径
}
// radius值的setter和getter方法
- (void)setRadius:(double)radius;
- (double)radius;
复制代码
编译链接发现有3个警告和1个错误:
circle.m:130:15: warning: 'Point2D' may not respond to 'radius'
double r=[c1 radius] + [c2 radius];
^
circle.m:130:29: warning: 'Point2D' may not respond to 'radius'
double r=[c1 radius] + [c2 radius];
^
circle.m:131:16: warning: class method '+diatanceBetweenPoint1:andPoint2:' not
found (return type defaults to 'id')
double dis=[Point2D diatanceBetweenPoint1:c1 andPoint2: c2];
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
circle.m:131:12: error: initializing 'double' with an expression of incompatible
type 'id'
double dis=[Point2D diatanceBetweenPoint1:c1 andPoint2: c2];
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 warnings and 1 error generated.
zous-Mac:objective-c shao$
复制代码
记得老师说过父类不能调用子类独有的方法,这导致了前两个警告,但是后面的警告和错误是怎么回事呢?
作者:
Harvey_ios
时间:
2015-5-9 17:12
//上面代码不完整,这里是我的完整代码
复制代码
作者:
Harvey_ios
时间:
2015-5-9 17:16
Harvey_ios 发表于 2015-5-9 17:12
/**
6.设计一个类Circle,用来表示二维平面中的圆
1> 属性
* double radius (半径)
* Point2D *point (圆心)
2> 方法
* 属性相应的set和get方法
* 设计一个对象方法判断跟其他圆是否相交(重叠返回YES,否则返回NO)
* 设计一个类方法判断两个圆是否相交(重叠返回YES,否则返回NO)
*/
#import <Foundation/Foundation.h>
#import <math.h>
// 点
@interface Point2D : NSObject
{
double _x; // x值
double _y; // y值
}
// x值的getter和setter
- (void)setX:(double)x;
- (double)x;
// y值的getter和setter
- (void)setY:(double)y;
- (double)y;
// 同时设置x和y
- (void)setX:(double)x andY:(double)y;
// 计算跟其他点的距离
- (double)distanceWithOther:(Point2D *)other;
// 计算两个点之间的距离
+ (double)distanceBetweenPoint1:(Point2D *)p1 andPoint2:(Point2D *)p2;
@end
@implementation Point2D
// x值的getter和setter
- (void)setX:(double)x
{
_x = x;
}
- (double)x
{
return _x;
}
// y值的getter和setter
- (void)setY:(double)y
{
_y = y;
}
- (double)y
{
return _y;
}
// 同时设置x和y
- (void)setX:(double)x andY:(double)y
{
// 第1种思路
// _x = x;
// _y = y;
// 第2种思路
[self setX:x];
[self setY:y];
}
// 计算跟其他点的距离
- (double)distanceWithOther:(Point2D *)other
{
// 不要再傻乎乎算一遍了,直接调用类方法即可
return [Point2D distanceBetweenPoint1:self andPoint2:other];
}
// 计算两个点之间的距离
+ (double)distanceBetweenPoint1:(Point2D *)p1 andPoint2:(Point2D *)p2
{
// 两点距离公式:( (x1-x2)的平方 + (y1-y2)的平方 )开根
// x1-x2
double xDelta = [p1 x] - [p2 x];
// (x1-x2)的平方
double xDeltaPingFang = pow(xDelta, 2);
// y1-y2
double yDelta = [p1 y] - [p2 y];
// (y1-y2)的平方
double yDeltaPingFang = pow(yDelta, 2);
return sqrt(xDeltaPingFang + yDeltaPingFang);
}
@end
@interface Circle : Point2D
{
double _radius;
}
// radius值的setter和getter方法
- (void)setRadius:(double)radius;
- (double)radius;
- (bool)xjWithOtherCircle :(Circle *)other;
+ (bool)xjBetweenCircle1: (Circle *)c1 andCircle2:(Circle *)c2;
@end
@implementation Circle
- (void)setRadius:(double)radius
{
_radius = radius;
}
- (double)radius
{
return _radius;
}
- (bool)xjWithOtherCircle :(Circle *)other
{
return [Circle xjBetweenCircle1:self andCircle2:other];
}
+ (bool)xjBetweenCircle1: (Point2D *)c1 andCircle2:(Point2D *)c2
{
// 判断两圆是否相交:两圆心的距离和半径之和比较大小
//1、如果圆心距离大于半径之和,则不想交
//2、如果圆心半径小于或等于半径之和,则相交
double r=[c1 radius] + [c2 radius];
double dis=[Point2D diatanceBetweenPoint1:c1 andPoint2: c2];
if(r<dis)
return NO;
else
return YES;
}
@end
int main()
{
Circle *p1 = [Circle new];
[p1 setX:10 andY:10];
[p1 setRadius:3];
Circle *p2 = [Circle new];
[p2 setX:13 andY:14];
[p2 setRadius:1];
// double d1 = [p1 distanceWithOther:p2];
//
double d2 = [Point2D distanceBetweenPoint1:p1 andPoint2:p2];
NSLog(@"%d", [Circle xjBetweenCircle1:p1 andCircle2:p2]);
return 0;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2