用对象方法实现计算器
/*
OC版计算器
思路1:
定义类: Caculator
属性 : num1 num2 result
行为: add jian cheng chu
思路2:
定义类:Caculator2
属性:
行为: add jian cheng chu (每个方法都需要两个参数,每个方法都有返回值)
*/
#import
#import "Caculator.h"
#import "Caculator2.h"
void test(){
//1、创建对象
Caculator *cal = [Caculator new];
cal->_num1 = 30;
cal->_num2 = 20;
//2、调用对象方法
[cal add];
//3、输出结果
NSLog(@"result = %.2f",cal->_result);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建对象
Caculator2 *c2 = [Caculator2 new];
int result = [c2 cheng:20 andNum2:30];
float f1 = [c2 chu:10 andNum2:3];
NSLog(@"result = %d,f1 = %.2f",result,f1);
}
return 0;
}
// 计算器类的声明
@interface Caculator2 : NSObject
//加法
-(int )add:(int )num1 andNum2:(int) num2;
//减法
-(int )jian:(int )num1 andNum2:(int) num2;
//乘法
-(int )cheng:(int )num1 andNum2:(int) num2;
//除
-(float )chu:(int )num1 andNum2:(int) num2;
@end
//计算器类的实现
@implementation Caculator2
//加法
-(int )add:(int )num1 andNum2:(int) num2{
return num1+num2;
}
//减法
-(int )jian:(int )num1 andNum2:(int) num2{
return num1-num2;
}
//乘法
-(int )cheng:(int )num1 andNum2:(int) num2{
return num1*num2;
}
//除
-(float )chu:(int )num1 andNum2:(int) num2{
return num1/(float)num2;
}
@end
用类方法实现计算器的功能
// 计算器类的声明
@interface Caculator : NSObject
//类方法的定义格式:
// 跟对象方法相比,把 - 换成 + 就可以了
//加法
+(int )add:(int )num1 andNum2:(int) num2;
//减法
+(int )jian:(int )num1 andNum2:(int) num2;
//乘法
+(int )cheng:(int )num1 andNum2:(int) num2;
//除
+(float )chu:(int )num1 andNum2:(int) num2;
@end
// 计算器类的实现
int main(int argc, const char * argv[]) {
@autoreleasepool {
//类方法的使用注意:
//1、类方法和对象方法可以同名,调用的时候,互不影响
//先调用类方法 ,必须使用类名来调用
[Person run]; //run 的类方法
//调用对象方法 必须使用对象来调用
Person *p = [Person new];
[p run]; //用对象来调用的,调用对象的run方法
//2、OC中的消息机制
[p run]; //向对象p发送一条run消息
//发送一个test消息
[Person test];
// [p test];
}
// Person类的声明
@interface Person : NSObject
// 声明类方法或者对象方法
-(void) run;
+(void) run;
+(void)test;
@end
// Person类的实现
@implementation Person
-(void) run{
NSLog(@"对象方法:run");
}
+(void) run{
NSLog(@"类方法:run");
}
+(void)test{
}
@end
/*
类方法容易犯的错误
1)在类方法中使用了实例变量
因为变量根本没有被分配内存空间,所以不能访问
2)类方法和对象方法的区别
类方法 对象方法
调用: 类名 对象名
声明: +开头 -开头
实例变量: 不能访问 能访问
方法调用:
1、在类方法中,能否调用对象方法? 可以
1)在类方法中创建一个新的对象
+(void)test{
Person *p = [Person new];
p->_speed = 280;
[p run];
}
2)对象作为类方法的参数传递过来
+(void)test:(Person *)person{
//对象作为方法的参数,传递过来
[person run];
}
3)在类方法中,可以调用其他对象的方法
2、在对象方法中,能否调用类方法? 可以类方法
1)调用当前类的类方法
-(void) run{
NSLog(@"人在以%d码的速度疯跑",_speed);
//能不能调用类方法呢?
[Person run];
}
2)还可以调用其他类的类方法
3、在类方法中不能调用自己
*/
#import
#import "Person.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建对象
// Person *p = [Person new];
// p->_speed = 180;
// [p run];
//调用类方法
// [Person test];
// [Person test:p];
[Dog bark];
}
return 0;
类方法适合用在不要求访问成员变量的方法中
// 定义IPhone类
typedef enum {kColorBlack,kColorWhite,kColorTHJ} IColor;
@interface IPhone : NSObject{
IColor _color;
}
//定义一个类方法,当我们给一个颜色的枚举值的时候,返回字符串
+(NSString *)getPhoneColor:(IColor) color;
@end
// 实现IPhone类
@implementation IPhone
+(NSString *)getPhoneColor:(IColor) color{
NSString *colorName;
switch (color) {
case kColorBlack:
colorName = @"黑色";
break;
case kColorWhite:
colorName = @"白色";
break;
case kColorTHJ:
colorName = @"土豪金";
break;
default:
break;
}
return colorName;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建对象
// Car *car1 = [Car new];
// car1->_lzNum = 4 ;
// car1->_speed = 180;
// //调用对象方法
//
// [car1 run];
// [car1 stop];
//[Car new] 匿名类
//关于匿名类访问成员变量:
//1)能够访问自己的实例变量
//2)只能正确地访问一次
// [Car new]->_lzNum = 80;
//
// NSLog(@"_lzNum = %d",[Car new]->_lzNum);
//匿名类调用方法
//Car *car1 = [Car new];
//使用匿名类可以调用方法
//调用方法的时候,可以简化代码
// [[Car new] run];
//创建对象的另一种写法
// [Car alloc]; //申请内存空间 malloc
// [init] //初始化方法
Car *c1 = [Car new];
Car *c2 = [[Car alloc] init];
//new ==== alloc init
//[Car new];
//使用[[Car alloc] init]作用和使用new是等价的
//但是,使用new的时候,每次实例变量默认的值都是0
//而使用alloc init 的方式,我们可以在初始化的时候,指定实例变量的初始值
// c2->_lzNum = 20;
// c2->_speed = 100;
[c2 run];
[c2 stop];
}
return 0;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建一个车
// Car *c1 = [Car new];
//
// Person *p = [Person new];
// [p goHomeByCar:c1];
//3、匿名类作为方法的参数
[[Person new] goHomeByCar:[Car new]];
}
return 0;
}
封装就是把类的成员属性保护起来,不能随便修改和调用,在设置的时候也可以加入过滤
typedef enum {kSexMan,kSexWomen,kSexYao} Sex;
@interface Person : NSObject
{
//给person声明一个实例变量
int _age;
NSString *_name;
Sex _sex;
}
//封装的目的:给实例实例变量 _age _name _sex 对外提供一个接口
//接口(对象方法):1)设置 实例变量的值 2)获取实例变量的值
//setter方法的书写规范
/*
set方法的声明的规范:
1)该方法没有返回值 void
2) 一定是一个对象方法 以-开头
3)方法名一定要以set开头,然后跟上 去掉下划线的实例变量名,并且实例变量名首字母要大写
4)set方法一定有一个参数,而且参数类型一定要和实例变量的类型要保持一致
5)set方法的形参名一般是 去掉下划线的实例变量名
set方法的实现:
1)在set方法的内部,必须要给实例变量赋值形参的值
2、获取实例变量的值
getter方法:作用,对外部提供了一个 可以获取对象实例变量值的一个接口
getter方法声明书写规范:
1)get方法一定有返回值 并且返回值类型和 实例变量的类型要保持一致
2)get方法也一定是一个对象方法 以-开头
3)get方法的名称 去掉下划线的实例变量名
getter方法的实现规范:
1)在方法的内部,一定要返回实例变量的值
*/
//声明 _age 这个实例变量的set方法
-(void)setAge:(int) age;
// _age 的get方法
-(int)age;
//声明: NSString *_name; set方法
-(void)setName:(NSString *) name;
-(NSString *)name;
//声明 Sex _sex 的set方法
-(void)setSex:(Sex) sex;
-(Sex)sex;
@end
// Person 类的实现
@implementation Person
//实现 _age 这个实例变量的set方法
-(void)setAge:(int) age{
if (age<0) {
_age = 10;
}else{
_age = age;
}
}
-(int)age{
return _age;
}
//实现: NSString *_name; set方法
-(void)setName:(NSString *) name{
_name = name;
}
-(NSString *)name{
return _name;
}
//实现 Sex _sex 的set方法
-(void)setSex:(Sex) sex{
_sex = sex;
}
-(Sex)sex{
return _sex;
}
@end
@interface KLine : NSObject
{
//最低价格(set、get)
float _minPrice;
//最高价格(set,get)
float _maxPrice;
//平均价格(get)
float _avgPrice;
}
//读写方法
// _minPrice 的set和get方法
-(void)setMinPrice:(float) minPrice;
-(float)minPrice;
-(void)setMaxPrice:(float) maxPrice;
-(float)maxPrice;
-(float)avgPrice;
@end
// 股票类的实现
@implementation KLine
-(void)setMinPrice:(float) minPrice{
_minPrice = minPrice;
//计算平均值
_avgPrice = (_maxPrice + _minPrice)/2;
}
-(float)minPrice{
return _minPrice;
}
-(void)setMaxPrice:(float) maxPrice{
_maxPrice = maxPrice;
//计算平均值
_avgPrice = (_maxPrice + _minPrice)/2;
}
-(float)maxPrice{
return _maxPrice;
}
-(float)avgPrice{
return _avgPrice;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
IPhone *iphone7plus = [IPhone new];
Gril *gril = [Gril new];
//A对象作为B对象的方法的形参或者是局部变量,此时我B依赖A
//girl -依赖-> iphone7plus
[gril call:iphone7plus];
}
return 0;
}
常见的关联关系有:1对1,1对多,多对多