黑马程序员---object-c知识点总结(三)封装,继承,多态

时间:2023-02-17 09:44:28

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

// 此文件中为Circle类的声明部分

#import"point2D.h"

@interface Circle : Point2D
{
double _radius ;//定义圆的半径
Point2D * _point ;//定义圆的圆心
}
// setter方法:设置半径的值
- (void)setRadius:(double)radius ;
// getter方法:获得半径的值
- (double)Radius ;

//setter方法:设置圆心的值
- (void)setPoint:(Point2D *)point ;
//etter方法:获得圆心的值
- (Point2D *)Point ;

// 对象方法,判断两个圆是否重叠
- (bool)isRichWithCircle:(Circle *)circle ;
// 类方法,判断两个圆是否重叠
+ (bool)isRichWithCircle1 :(Circle *)circle1 addCircle2:(Circle *)circle2 ;
@end



#import"circle.h"
//#import<Foundation/Foundation.h>

@implementation Circle
// setter方法:设置半径的值
- (void)setRadius:(double)radius
{
_radius = radius ;
}
// getter方法:获得半径的值
- (double)Radius
{
return _radius ;
}

//setter方法:设置圆心的值
- (void)setPoint:(Point2D *)point
{
_point = point ;
}
//etter方法:获得圆心的值
- (Point2D *)Point
{
return _point ;
}

// 对象方法,判断两个圆是否重叠
- (bool)isRichWithCircle:(Circle *)circle
{
//获取圆中第一个点的值
Point2D * point1 = [self Point] ;
//获取圆中第二个点的值
Point2D * point2 = [circle Point] ;

//求两个点的的距离
double distance = [point1 distanceToPoint:point2] ;
//求两个圆半径的和
double radiusOfDistance = [self Radius] + [circle Radius] ;

//输出圆心距和半径和
NSLog(@"\ndistance = %f,\nradiusOfDistance = %f",distance,radiusOfDistance);

//判断两个圆的位置关系
return distance < radiusOfDistance ;
}

// 类方法,判断两个圆是否重叠
+ (bool)isRichWithCircle1 :(Circle *)circle1 addCircle2:(Circle *)circle2
{
//调用对象方法求两个圆的位置关系
return [circle1 isRichWithCircle:circle2] ;
}
@end


#import<math.h>
#import<Foundation/Foundation.h>

@interface Point2D:NSObject
{
double _x ;// 设置x
double _y ;// 设置y

}
// 1.同类的方法写在一起,不同类方法之间要用一行来隔开
// 2.要注意经常写注释,阐明代码的实现的功能
// 3.注释符后面要留出一个空格

// 设置x值的getter和setter方法
- (void)setX:(double)x ;
- (double)getX ;

// 设置y值的getter和setter方法
- (void)setY:(double)y ;
- (double)getY ;

// 同时设置point的x值和y值
- (void)setPointWithX:(double)x setPointWithY:(double)y ;

// 对象方法计算两个点之间的距离
- (double)distanceToPoint:(Point2D *)point ;

// 类方法计算两个点之间的距离
+ (double)distanceToPoint1:(Point2D *)point1 addPoint2:(Point2D *)point2 ;

// 显示该point的坐标
- (void)showPoint ;
@end


#import<math.h>
#import<Foundation/Foundation.h>

// 规范书写代码格式:1.(11) 2.(12)3.(13)

@interface Point2D:NSObject
{
double _x ;//设置x
double _y ;

}
// 1.同类的方法写在一起,不同类方法之间要用一行来隔开
// 2.要注意经常写注释,阐明代码的实现的功能
// 3.注释符后面要留出一个空格

// 设置x值的getter和setter方法
- (void)setX:(double)x ;
- (double)getX ;

// 设置y值的getter和setter方法
- (void)setY:(double)y ;
- (double)getY ;

// 同时设置point的x值和y值
- (void)setPointWithX:(double)x setPointWithY:(double)y ;

// 对象方法计算两个点之间的距离
- (double)distanceToPoint:(Point2D *)point ;

// 类方法计算两个点之间的距离
+ (double)distanceToPoint1:(Point2D *)point1 addPoint2:(Point2D *)point2 ;

// 显示该point的坐标
- (void)showPoint ;
@end
*/

#import"point2D.h"

@implementation Point2D

- (void)setX:(double)x
{
//如果需要判断x的坐标范围,可以在此进行判断
_x = x ;
}

- (double)getX
{
return _x ;
}

- (void)setY:(double)y
{
_y = y ;
}

- (double)getY
{
return _y ;
}

- (void)setPointWithX:(double)x setPointWithY:(double)y
{
// 第一种写法
/*
_x = x ;
_y = y ;
*/

// 第二种写法
/*
self->_x = x ;
self->_y = y ;
*/

//第三种写法(最好是用第三种书写方式,不用重复对x和y的值进行判断,已在set方法中过滤过);

[self setX:x];
[self setY:y];



}
//方法一:简单的写出方法,不含对象中类方法的调用
- (double)distanceToPoint:(Point2D *)point
{
//方法一(自己写的)
/*
double x1 = pow( self->_x - point->_x,2) ;
double y1 = pow( self->_y - point->_y,2) ;
return sqrt(x1 + y1) ;
*/

//方法二(老师写的)
// x1 - x2
double xDelta = _x - [point getX] ;
// (x1 - x2)的平方
double xDeltaPF = pow(xDelta,2.0) ;

// y1 - y2
double yDelta = _y - [point getY] ;
// (y1 - y2)的平方
double yDeltaPF = pow(yDelta,2.0) ;

// 返回距离
return sqrt(xDeltaPF + yDeltaPF) ;

}

//方法二:直接在对象方法中调用类方法(与类中的方法一相连接)
/*
- (double)distanceToPoint:(Point2D *)point
{
return [Point2D distanceToPoint1:self addPoint2:point];

}
*/

- (void)showPoint
{
NSLog(@"\n_x = %f \n_y = %f",_x ,_y) ;
}

/*
// 方法一
+ (double)distanceToPoint1:(Point2D *)point1 addPoint2:(Point2D *)point2
{
// x1 - x2
double xDelta = [point1 getX] - [point2 getX] ;
// (x1 - x2)的平方
double xDeltaPF = pow(xDelta,2.0) ;

// y1 - y2
double yDelta = [point1 getY] - [point2 getY] ;
// (y1 - y2)的平方
double yDeltaPF = pow(yDelta,2.0) ;

//返回距离
return sqrt(xDeltaPF + yDeltaPF) ;
}
*/

//方法二:代码简化调用,直接在类方法中调用对象方法求两个点的距离(与对象中的方法一相连接)
+ (double)distanceToPoint1:(Point2D *)point1 addPoint2:(Point2D *)point2
{
return [point1 distanceToPoint:point2] ;
//return [point2 distanceToPoint:point1] ;
}

@end



// 加载Point2D类到主函数文件中
#import"point2D.h"
// 加载Circle类到主函数文件中
#import"circle.h"

/*
注意:xcode编译器与终端链接程序的区别:xcode集成了编译一个主函数文件会自动同时编译相关的目标文件,加载到程序中一起运行。然而终端如果想要运行相关的目标文件必须把相关目标文件都加载到程序中
*/

int main()
{
// new出一个圆的对象circle1
Circle * circle1 = [Circle new] ;
// 给circle1圆的半径赋值
[circle1 setRadius:5];
// new出一个点作为之后的圆心point1
Point2D * point1 = [Point2D new] ;
// 给point1赋初始值
[point1 setPointWithX:5 setPointWithY:5] ;
// 把该点作为圆心
[circle1 setPoint:point1] ;

Circle * circle2 = [Circle new] ;
[circle2 setRadius:2];
Point2D * point2 = [Point2D new] ;
[point2 setPointWithX:12 setPointWithY:19] ;
[circle2 setPoint:point2] ;

//用对象方法求两个圆的位置关系
//int result = [circle1 isRichWithCircle:circle2] ;
//用类方法求两个圆的位置关系
int result = [Circle isRichWithCircle1:circle1 addCircle2:circle2];
NSLog(@"result = %d",result) ;

/*
NSString *str = @"这个程序终于做完了! ";
NSLog(@"%@",str);

// 求字符串的字符个数(注意区别不是字节个数,即汉字和空格只是占用一个字符数);
int strLength = [str length] ;
NSLog(@"strLength = %d",strLength) ;
*/

return0 ;
}