8.属性和继承

1.main.m文件

//继承是单向的,一个类只能有一个父类,但是一个类可以有无数个子类,NSObject是所有类的父类.也可以成为基类
//C语言中如果针对一个空指针技能型操作,比如赋值,系统运行到这句代码系统就会崩溃,然而OC遇到空指针会把当成一句废代码,会执行,但是不会有任何结果
Person *person = [[Person alloc]init];
//对象通过设置器对成员变量内容进行修改
[person sname:@"张三"];
NSLog(@"%@",[person gname]);//--->张三

Student *student = [[Student alloc]init];
[student sname:@"yingwang"];
//继承:子类会继承父类所有的特征还有行为,类的继承具有传递性
//当对象在执行方法的时候,子类重写了父类的方法,系统会优先使用子类的方法,如果没有重写,则用父类的方法
[student eat];//--->Person eat
[student sayHi];//-->Person sayHi //--> Student sayHi
NSLog(@"%@",[student gname]);//--->yingwang

//属性一共做了三件事
//1.声明了设置器setter和访问器getter
//2.实现了设置器和访问器]
//3.声明了一个成员变量,成员变量命名会在属性名的前面加一个下划线
//具体的数据存储,还是成员变量来完成,属性只是帮助程序员完成一些繁琐的工作,简化代码
//针对对象的属性,可以通过点语法来设置和获取里面的内容,大量节省了代码
//离=近的都是setter方法,其余都是getter方法
student.name = @"zhangxiaoyu";
NSLog(@"%@",student.name);//--->zhangxiaoyu

//KVC:key - value - coding 键值编码
//把属性名看成kvc中的key,把要修改的值看成value,然后是通过KVC的方法,把值赋给指定的key
[student setValue:@"崔某" forKey:@"name"];
NSLog(@"%@",student.name);//--->崔某
NSLog(@"%@",[student valueForKey:@"name"]);//--->崔某

2.Person.h和Person.m文件

#import <Foundation/Foundation.h>

@interface Person : NSObject

//1.读写控制:readonly(属性只有getter方法),readwrite(默认)
//setter和getterd的作用是给设置器和访问器方法重新起一个名字,注意:设置器在名字的设置的时候不能缺省:
@property(setter=sname:,getter=gname)NSString *name;
//2.原子性控制:nonatomic,atomic
//通过原子性atomic来监控事物在整个过程中有没有完成,但是一般来讲我们就是对数据的简单赋值,一般这部分我们用非原子性nonatomic
//3.语义设置:copy(NSString),retain(对象类型和NSArray),assign(NSInteger,CGGloat等栈区)
@property(nonatomic,copy,readonly)NSString *color;
@property(nonatomic,assign)NSInteger age;

- (void)sayHi;
- (void)eat;
//自定义初始化方法的声明 --->返回类型可以是(id)或则(Person *)
- (instancetype)initWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age;
//便利构造器  --->返回类型可以是(id)或则(Person *)
+ (instancetype)personWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age;

@end
#import "Person.h"

@implementation Person
//关键词是@synthesize,前面放属性名,后面放成员变量
//@synthesize name = _name;在XCode 4.5之后可以不写
- (void)sayHi
{
    NSLog(@"Person sayHi");
}
- (void)eat
{
    NSLog(@"Person eat");
}

- (instancetype)initWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age
{
    //先调用一下父类的初始化方法,对父类继承过来的成员变量进行设置
    self = [super init];
    //当这个对象在初始化过程中出现问题,会返回一个空指针,如果是空指针接下来的赋值就没有意义,跳过去,如果返回是一个正常的对空间地址,才能继续赋值
    if (self) {
        self.name = name;
        //self.color = color;--->属性为:readonly,不能进行赋值
        _color = color;//---_color为成员变量可以赋值
        //self.age = age;--->基本数据类型不需要你内存管理
        _age = age;
    }
    return self;
}

+ (instancetype)personWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age
{
    //便利构造器把创建对象的过程放到了程序的.m文件里,这样通过类,直接就能创建出一个对象出来
    Person *person = [[Person alloc] initWithName:name color:color age:age];
    return person;
}

@end

3.Student.h和Student.m文件

#import "Person.h"

@interface Student : Person
//子类只需要写自己特有的特征和方法就可以,其余的都会继承
@property(nonatomic,assign)CGFloat stuScore;

- (instancetype)initWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age stuScore:(CGFloat)stuScore;
+ (instancetype)studentWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age
stuScore:(CGFloat)stuScore;

@end
#import "Student.h"

@implementation Student

//重写父类的方法,只需要在.m文件里写实现,不用声明,优先调用自己的方法
- (void)sayHi
{
    //super就是寻找继承过来的方法,并且执行该方法
    [super sayHi];
    NSLog(@"Student sayHi");
}

- (instancetype)initWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age stuScore:(CGFloat)stuScore
{
    self = [super initWithName:name color:color age:age];
    if (self) {
        _stuScore = stuScore;
    }
    return self;
}

+ (instancetype)studentWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age
                      stuScore:(CGFloat)stuScore
{
    Student *student = [[Student alloc] initWithName:name color:color age:age stuScore:stuScore];
    return student;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值