黑马程序员-IOS-OC基础-面向对象语法二

-------------------------------------- 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培训期待与您交流! ---------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值