iOS--面对对象的语法

 

一、     set方法和get方法

1.         set方法和get方法的使用场合

 

@public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问

(类似机场的安检、水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数

2.         set方法

1)      作用:用来设置成员变量的值,可以在方法里面加一些条件判断用来过滤掉一些不合理的值

2)      命名规范:

Ø   方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写

Ø   形参名称不要跟成员变量同名

3.         get方法

1)      作用:返回对象内部的成员变量

2)      命名规范:get方法的名称一般就跟成员变量同名

4.         成员变量的命名规范

Ø   成员变量都以下划线 _ 开头

Ø   可以跟get方法的名称区分开

Ø   可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量

5.         代码示例

 

#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

 

 

 

 

 

6.         封装的好处

Ø   过滤不合理的值

Ø   屏蔽内部的赋值过程

Ø   让外界不必关注内部的细节

7.         练习

1>    Dog类,属性:weight、speed,方法:吃、跑

2>    Person类,属性:dog、age,方法:喂狗、遛狗

没有用get方法,set方法

 

//
//  main.m
//  wenti2
//
//  Created by apple-mac on 15/6/25.
//  Copyright (c) 2015年 ludong. All rights reserved.
//

#import <Foundation/Foundation.h>
@interface Dog : NSObject
{
    @public  //错误提醒学过c++的同学容易写成(public:)
    int _weight;
    int _speed;
}
- (void)run;
- (void)eat;
@end
@implementation Dog
- (void)run
{
    NSLog(@"这是run方法。");
}
- (void)eat
{
    NSLog(@"这是eat方法。");
}
@end
@interface Person : NSObject
{
    @public
    Dog* _dog; //提醒必须为指针
    int _age;
}
- (void)liuDog;
- (void)weiDog;
@end
@implementation Person
- (void)liuDog
{
    NSLog(@"遛狗啦,狗的速度是:%d",_dog->_speed);
}
- (void)weiDog
{
    NSLog(@"喂狗啦,狗的体重时:%d",_dog->_weight);
}
@end
int main(int argc, const char * argv[]) {
    Dog *dog = [Dog new];
    dog->_speed = 100;
    dog->_weight = 50;
    [dog run];
    [dog eat];
    Person *per = [Person new];
    per->_age = 10;
    per->_dog = dog;
    [per liuDog];
    [per weiDog];

    return 0;
}

 

使用get方法,set方法:

 

#import <Foundation/Foundation.h>
@interface Dog : NSObject
{
    int _weight;
    int _speed;
}
- (void)setWeight:(int)num;
- (int)weight;
- (void)setSpeed:(int)num;
- (int)speed;
- (void)run;
- (void)eat;
@end
@implementation Dog
- (void)setWeight:(int)num
{
    _weight = num;
}
- (int)weight
{
    return _weight;
}
- (void)setSpeed:(int)num
{
    _speed = num;
}
- (int)speed
{
    return _speed;
}
- (void)run
{
    NSLog(@"这是run方法。");
}
- (void)eat
{
    NSLog(@"这是eat方法。");
}
@end
@interface Person : NSObject
{
    Dog* _dog;
    int _age;
}
- (void)setDog:(Dog *)dog;
- (Dog *)dog;
- (void)setAge:(int)age;
- (int)age;
- (void)liuDog;
- (void)weiDog;
@end
@implementation Person
- (void)setDog:(Dog *)dog
{
    _dog = dog;
}
- (Dog *)dog
{
    return _dog;
}
- (void)setAge:(int)age
{
    _age = age;
}
- (int)age
{
    return _age;
}
- (void)liuDog
{
    NSLog(@"遛狗啦,狗的速度是:%d",[_dog speed]);
}
- (void)weiDog
{
    NSLog(@"喂狗啦,狗的体重时:%d",[_dog weight]);
}
@end
int main(int argc, const char * argv[]) {
    Dog *dog = [Dog new];
    [dog setSpeed:100];
    [dog setWeight:50];
    [dog run];
    [dog eat];
    Person *per = [Person new];
    [per setAge:10];
    [per setDog:dog];
    [per liuDog];
    [per weiDog];

    return 0;
}

 

 错误提示:

 

 error: Semantic Issue: Interface type cannot be statically allocated

出现这个错误的原因是

接口声明对象时(我这么一说,大家应该懂我意思吧),必须声明为引用,即指针

 

二、     类方法

1.     基本概念

直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)

2.     类方法和对象方法对比

1)       对象方法

Ø   以减号-开头(对象方法只能被对象调用

Ø   只能让对象调用,没有对象,这个方法根本不可能被执行

Ø   对象方法能访问实例变量(成员变量)

 

2)       方法

Ø   以加号+开头

Ø   只能用类名调用,对象不能调用

Ø   类方法中不能访问实例变量(成员变量)

Ø  使用场合:当不需要访问成员变量的时候,尽量用类方法

3)      类方法和对象方法可以同名

3.     示例

Ø   设计一个方法输出类名

 

#import <Foundation/Foundation.h>
@interface Car : NSObject
+ (NSString *)name;
- (NSString *)name;
@end
@implementation Car

+ (NSString *)name
{
    return NSStringFromClass([Car class]);
}
- (NSString *)name
{
    return NSStringFromClass([self class]);
}
@end
int main(int argc, const char * argv[]) {
    Car *c = [Car new];
    NSLog(@"%@",[Car name]);
    NSLog(@"%@",[c name]);
    return 0;
}

 

 

 

三、     self关键字

1.     成员变量和局部变量同名

Ø   当成员变量和局部变量同名时,采取就近原则,访问的是局部变量

Ø   用self访问成员变量,区分同名的局部变量

2.     使用细节

1)    出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数

2)    作用

Ø   使用 "self->成员变量名"访问当前方法调用的成员变量

Ø   使用 "[self 方法名];"来调用方法(对象方法\类方法)

3.     常见错误

Ø   低级错误:用self去调用函数

Ø   类方法中用self调用对象方法,对象方法中用self调用类方法

Ø   self死循环

4.     示例

 

四、     习题

1.      设计Car类,一个对象方法跟其他车子比较车速,返回速度差,一个类方法比较两辆车的车速,返回速度差

 

#import <Foundation/Foundation.h>
// 类的声明
@interface Car : NSObject
{
@public
    int wheels; // 多少个轮子
    int speed; // 时速
}
- (void)run; // 跑的行为
- (int)compare:(Car *)car1; //比较车速
+ (int)compare:(Car *)car1 andOtherCar:(Car *)car2;
@end
@implementation Car
- (void) run
{
    NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);
}
- (int)compare:(Car *)car1
{
    return self->speed-car1->speed;
}
+ (int)compare:(Car *)car1 andOtherCar:(Car *)car2
{
    return car1->speed-car2->speed;
}
@end

int main(int argc, const char * argv[]) {
    Car *c1 = [Car new];
    c1->wheels = 4;
    c1->speed = 150;
    Car *c2 = [Car new];
    c2->wheels = 4;
    c2->speed = 200;
    NSLog(@"%d",[c1 compare:c2]);
    NSLog(@"%d",[Car compare:c1 andOtherCar:c2]);
    return 0;
}

 

 

一、     继承

1.     继承的基本用法

 

l   设计两个类Bird、Dog

 

// Bird的声明
@interface Bird : NSObject
{
    @public
    int weight;
}
- (void)eat;
@end
// Bird的定义
@implementation Bird
- (void)eat {
    NSLog(@"吃吃吃-体重:%d",weight);
}
@end
// Dog的声明
@interface Dog : NSObject
{
    @public
    int weight;
}
- (void)eat;
@end
// Dog的定义
@implementation Dog
- (void)eat {
    NSLog(@"吃吃吃-体重:%d",weight);
}
@end
l   有相同的属性和行为,抽出一个父类Animal(先抽取weight属性,再抽取eat方法)
// Animal的声明
@interface Animal : NSObject
{
    @public
       int weight;
}
- (void)eat;
@end
// Animal的定义
@implementationAnimal
- (void)eat{
    NSLog(@"吃吃吃-体重:%d",weight);
}
@end
l   子类在父类的基础上拓充属性和方法
// Bird的声明
@interfaceBird : Animal
{
    @public
        intheight;
}
- (void)fly;
@end
 
// Bird的定义
@implementationBird
- (void)fly{
    NSLog(@"飞飞飞-高度:%d",height);
}
@end
 
// Dog的声明
@interface Dog: Animal
{
    @public
        intspeed;
}
- (void)run;
@end
// Dog的定义
@implementation Dog
- (void)run{
    NSLog(@"跑跑跑-高度:%d",speed);
}
@end

 

 

 

 

 

l   子类方法和属性的访问过程:如果子类没有,就去访问父类的

l   父类被继承了还是能照常使用的

l   父类的静态方法

l   画继承结构图,从子类抽取到父类

l   NSObject的引出:全部OC类的最终父类,包含了一些常用方法,比如+new

 

2.     继承的专业术语

l   父类\超类  superclass

l   子类  subclass\subclasses

 

3.     继承的细节

l   单继承

l   子类和父类不能有相同的成员变量

l   方法的重写

 

4.     super关键字

l   分别调用父类的对象方法和类方法

5.     继承的好处

l   不改变原来模型的基础上,拓充方法

l   建立了类与类之间的联系

l   抽取了公共代码

l   坏处:耦合性强

6.     继承的使用场合

l   它的所有属性都是你想要的,一般就继承

l   它的部分属性是你想要的,可以抽取出另一个父类

二、     多态

1.多态的基本概念

l   某一类事物的多种形态

l   OC对象具有多态性

2.多态的体现

 

Person *p = [Student new];
p->age = 100;
[p walk];

 

 

 

 

 

l  子类对象赋值给父类指针

l  父类指针访问对应的属性和方法

3.多态的好处

l   用父类接收参数,节省代码

4.多态的局限性

l   不能访问子类的属性(可以考虑强制转换)

5.多态的细节

l   动态绑定:在运行时根据对象的类型确定动态调用的方法

三、     NSString的简单使用

1.         字符串的快速创建

NSStirng *str = @“Hello”;

2.         使用静态方法创建

3.         使用%@输出字符串

NSString *name = @”mj”;

NSLog(@“我的名字是%@”,  name);

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值