-------------------------------------- android培训、java培训、ios培训期待与您交流! ---------------------------------
类的合理设计
/*
学生:
成员变量:性别、生日、体重、最喜欢的颜色、狗(体重、毛色、吃、跑)
方法:吃、跑、遛狗(让狗跑)、喂狗(让狗吃)
*/
#import <Foundation/Foundation.h>
typedef enum{
SexMan,
SexWoman
}Sex;
typedef struct {
int year;
int month;
int day;
}Date;
typedef enum{
ColorRed,
ColorBlack
} Color;
typedef enum{
DogColorRed,
DogColorWhite
} DogColor;
//狗
@interface Dog : NSObject
{
@public
int weight;
DogColor skincolor;
}
-(void)eat;
-(void)run;
@end
@implementation Dog
-(void)eat
{
NSLog(@"吃骨头");
}
-(void)run
{
NSLog(@"追兔子");
}
@end
//学生
@interface Student : NSObject
{
@public
Sex sex;
Date birthday;
double weight;
Color favirate;
Dog *mydog;
}
-(void)eat;
-(void)run;
-(void)liugou;
-(void)feedog;
@end
@implementation Student
-(void)eat
{
NSLog(@"吃东西");
}
-(void)run
{
NSLog(@"在跑");
}
-(void)liugou
{
[mydog run];
}
-(void)feedog
{
[mydog eat];
}
@end
int main()
{
Student *s = [Student new];
Dog *g = [Dog new];
s->mydog = g;//把[Dog new]指针赋值给s指向的指针mydog
s->sex = SexMan;
Date d = {1999,8,9};
s->birthday = d;
s->weight = 60;
s->favirate = ColorBlack;
[s liugou];
[s feedog];
[s run];
g->weight = 30;
g->skincolor = DogColorRed;
//[g run];
//[g eat];
return 0;
}
set方法和get方法
1. set方法和get方法的使用场合
@public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检、水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数
2. set方法
1) 作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值
2) 命名规范:
Ø 方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写
Ø 形参名称不要跟成员变量同名
3. get方法
1) 作用:返回对象内部的成员变量
2) 命名规范:get方法的名称一般就跟成员变量同名
4. 成员变量的命名规范
Ø 成员变量都以下划线 _ 开头
Ø 可以跟get方法的名称区分开
Ø 可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量
#import <Foundation/Foundation.h>
// 声明
@interface Car : NSObject
{
int _wheels; // 轮子个数
}
/*set方法*/
- (void) setWheels:(int)wheels;
/*get方法*/
- (int) wheels;
@end
@implementation Car
// set方法的实现
- (void) setWheels:(int)wheels
{
// 对外面传进来的轮子数进行过滤
if (wheels<=0)
{
wheels = 1;
}
_wheels = wheels;
}
// get方法的实现
- (int) wheels
{
return _wheels;
}
@end
面向对象的三大特性
面向对象的三大特性:封装、继承、多态
1,封装
<1>封装的好处:
1,过滤不合理的值。2,屏蔽内部的赋值过程。3,让外界不必关注内部的细节。
//封装
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
/*
成员变量得到命名规范:一定要以下划线 _开头
作用是:
1,让成员变量和get方法的名称区分开;
2,可以跟局部变量区分开,
*/
//@public //成员变量尽量不要用@public
int _age;
}
/*set方法
1,作用:提供一个方法给外界设置成员变量值
2.命名规范:
1>,方法名必须以set开头
2>,set后面跟上成员变量的名称,成员变量的字母必须大写(setAge)
3>,返回值一定是void
4>,一定要接收一个参数,而且参数类型跟成员变量类型一致
5>,形参的名称不能跟成员变量名一样
*/
//声明set方法
- (void)setAge:(int)age;
/*
get方法
1,作用:返回对象内部的成员变量。
2,命名规范:
1>,肯定有返回值,返回值类型与成员变量类型一致
2>,方法名跟成员变量名一致
3>,不需要接收任何参数
*/
//声明get方法
- (int)age;
//声明study方法
- (void)study;
@end
@implementation Student
//实现set方法
- (void)setAge:(int)age
{
//对传进来的参数进过滤
if (age <= 0)
{
age = 1;
}
_age = age;
}
//实现get方法
- (int)age
{
return _age;
}
//实现study方法
- (void)study
{
NSLog(@"%d岁的学生在学习",_age);
}
@end
int main()
{
//创建Student类对象
Student *s = [Student new];
//s ->_age = 10; //成员变量加@public才可以这样做,但是尽量不要这样。
[s setAge:25];
[s study];
NSLog(@"学生的年龄%d",[s age]);
return 0;
}
类方法
1. 基本概念
直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)
2. 类方法和对象方法对比
1) 对象方法
Ø 以减号-开头
Ø 只能让对象调用,没有对象,这个方法根本不可能被执行
Ø 对象方法能访问实例变量(成员变量)
2) 类方法
Ø 以加号+开头
Ø 只能用类名调用,对象不能调用
Ø 类方法中不能访问实例变量(成员变量)
Ø 使用场合:当不需要访问成员变量的时候,尽量用类方法
3) 类方法和对象方法可以同名
#import <Foundation/Foundation.h>
/*
对象方法
1> 减号 - 开头
2> 只能由对象来调用
3> 对象方法中能访问当前对象的成员变量(实例变量)
类方法
1> 加号 + 开头
2> 只能由类(名)来调用
3> 类方法中不能访问成员变量(实例变量)
类方法的好处和使用场合
1> 不依赖于对象,执行效率高
2> 能用类方法,尽量用类方法
3> 场合:当方法内部不需要使用到成员变量时,就可以改为类方法
可以允许类方法和对象方法同名
*/
@interface Person : NSObject
{
int age;
}
// 类方法都是以+开头
+ (void)printClassName;
- (void)test;
+ (void)test;
@end
@implementation Person
+ (void)printClassName
{
// error:instance variable 'age' accessed in class method
// 实例变量age不能在类方法中访问
//NSLog(@"这个类叫做Person-%d", age);
}
- (void)test
{
NSLog(@"111-%d", age);
//[Person test];
}
+ (void)test
{
// 会引发死循环
//[Person test];
NSLog(@"333");
// 会引发死循环
// /[Person test];
}
@end
int main()
{
//[Person printClassName];
[Person test];
//Person *p = [Person new];
//[p test];
/*
-[Person printClassName]: unrecognized selector sent to instance 0x7fa520c0b370
*/
// 系统会认为现在调用的printClassName是个对象方法
//[p printClassName];
return 0;
}
小练习:
/*
设计一个计算器类
* 求和
* 求平均值
*/
#import <Foundation/Foundation.h>
// 工具类:基本没有任何成员变量,里面的方法基本都是类方法
@interface JiSusnQi : NSObject
+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;
+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;
@end
@implementation JiSusnQi
+ (int)sumOfNum1:(int)num1 andNum2:(int)num2
{
return num1 + num2;
}
+ (int)averageOfNum1:(int)num1 andNum2:(int)num2
{
int sum = [JiSusnQi sumOfNum1:num1 andNum2:num2];
return sum / 2;
}
@end
int main()
{
int a = [JiSusnQi averageOfNum1:10 andNum2:12];
NSLog(@"a=%d", a);
// JiSusnQi *jsq = [JiSusnQi new];
//
//
// [jsq sumOfNum1:10 andNum2:13];
return 0;
}
-------------------------------------- android培训 、 java培训 、ios培训期待与您交流! ---------------------------------