黑马程序员技术交流社区

标题: ios自学笔记第一天 [打印本页]

作者: Ye•Ye    时间: 2014-4-29 17:15
标题: ios自学笔记第一天
OC中的面向对象三大特性
一、        封装
1、封装具体一点说就是对成员变量的封装,为了防止我们的成员变量被误操作,所以尽量不把成员变量设为public,而是通过set方法向外界提供一个接口,间接地更改类中的属性。通过set我们可以限制传入的值,是我们的代码更安全。
使用set方法要遵守一些规范,例如:
(1)        方法名必须以set开头;
(2)        set后面直接加上成员变量名,并且第一个字母要大写,比如下面例子中的setAge方法;
(3)        返回值一定是void
(4)        一定要接收一个参数,参数类型和成员变量类型一致;
(5)        形参的名称不能跟成员变量名一样。
#import <Foundation/Foundation.h>

@interface Student:NSObject
{
    @public
    int _age;
}
//提供一个方法给外界设置age属性值
- (void)setAge:(int)newAge;
- (void)study;
@end



@implementation Student
//set方法的实现
- (void)setAge:(int)newAge
{
           if(newAge <= 0)//对传进来的参数进行过滤
        {
            newAge = 1;
        }
        _age = Age;
}
- (void)study
{
        NSLog(@"%d岁的学生在学习",age);
}
@end

int main()
{
        Student *stu = [Student new];
        //stu->age = 20;
        [stu setAge:10];

        [stdu study];
        return 0;
}
2、通过get方法获取属性的值,同样需要遵守相应的规范:
   (1)一定有返回值,与获取属性类型一致;
    (2)方法名与成员变量名一致;
    (3)不接收参数。
#import <Foundation/Foundation.h>

@interface Student:NSObject
{
    @public
    int _age;
}
- (vlid)age;
@end



@implementation Student
- (int)age
{
        return age;
}
@end

int main()
{
        [str age];
        return 0;
}
二、        继承
1、继承就是子类拥有父类的所有属性和方法,这样做可以抽取重用的代码,减少代码量,使程序更精简。只需在类名后加上冒号,跟上需要继承的类名即可。
继承不可以随便使用,不能仅因为一个类的成员是另一个类成员的子集,而简单将其定义成子类,例如:
@interface Score:NSObject
{
        int _cScore;
        int _ocScore;
}
@end

@implementation Score
@end

@interface Student:Score
{
        //int _cScore;
        //int _ocScore;
        int _age;
}
@end

@implementation Student
@end
    这里的成绩类有两个属性,与学生类的其中两个属性一样,但是两个类没有继承的关系,不能说“学生”是一个“分数”,所以这种情况不应该用继承,而是用“组合”。如下:
@interface Score:NSObject
{
        int _cScore;
        int _ocScore;
}
@end

@implementation Score
@end

@interface Student:NSObject
{
        //组合
        Score *score;//把Score变成Student的一部分
        int _age;
}
@end

@implementation Student
@end
     所以如果两个类是“一个是另一个”的关系,用继承;而若是“一个类拥有另一个类”则用组合。
2、如果在子类中想调用父类的同名方法,需要用到super关键字,例如:
#import <Foundation/Foundation.h>

@interface Zombie:NSObject
- (void)walk;
@end

@implementation Zombie
- (void)walk
{
        NSLog(@"往前挪两步----");
}

@interface JumpZombie:Zombie

@end

@implementation JumpZombie
- (void)walk
{
        //跳两下
        NSLog(@"跳两下----");

        //走两下
        [super walk];//调用父类的walk方法
}
@end

int main()
{
        JumpZombie *jz = [JumpZombie new];
        [jz walk];
        return 0;
}
三、多态
多态是指对象的多种形态,主要是在类的继承时体现,可以说没有继承就不存在多态这个概念。

1.        多态的基本使用。这里有两个类,父类是Animal,子类是Dog。 “Animal *a = [Dog new];”这一句是把父类Animal的指针指向Dog类,对象a的本质还是Dog,所以用a来调用eat方法是调用Dog类的eat方法。

#import <Foundation/Foundation>

@interface Animal:NSObject
-(void)eat;
@end

@implementation Animal
-(void)eat
{
NSLog(@"吃东西----");
}
@end

@interace Dog:Animal
-(void)eat;
@end

@implementation Dog
-(void)eat
{
NSLog(@"Dog-吃东西----");
}
@end
int main()
{
//多种形态
Dog *d = [Dog new];//Dog类型

//多态:父类指针指向子类对象
Animal *a = [Dog new];

[a eat];//此时a对象的真实类型实际上是Dog类的对象,所以a调用的是Dog
        //类的eat方法

NSObject *n = [Dog new];//也是多态

return 0;
}
   
2.        OC中使用多态的注意事项。
Objective-C是弱类型语法,OC的编译器的容错能力很强,一些不合逻辑的语法或错的很离谱的语法在OC编译器编译时不会报错而只会警告。比如:
(1)        把子类的指针指向一个父类的对象;
例如:Dog  *p = [Animal new];
(2)        把一个毫不相关的指针指向一个对象。
例如:NSString *s = [Dog new]。
上边这两种情况在其他的编译器会报错。

总结就是对象在实例化时等号左边的类无论是什么类型,OC的编译器都不会报错。

作者: 兰闻天    时间: 2014-4-29 17:56
第一天就学面向对象三大特性,真列害啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2