2、类和对象-实例变量可见度

2、类和对象-实例变量可见度


Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    /** 实例变量可见度分3种:
     *  public : 公有的,可见度最高,外部、内部、子类均可访问,缺点不安全
     *  protected : 默认的,只有内部和子类可以访问,最常用
     *  private : 私有的,可见度最低,只有自己能使用
     */

    @public
    NSString *_address;
    NSString *_hobby;

    @protected
    NSString *_name;
    NSInteger _age;

    @private
    NSString *_gender;
}

// 声明赋值的方法
- (void)setName:(NSString *)newName;
- (void)setAge:(NSInteger)newAge;
- (void)setGender:(NSString *)newGender;

// 声明取值方法
- (NSString *)name;
- (NSInteger)age;
- (NSString *)gender;

// 声明有2\3个参数的方法
- (void)setName:(NSString *)name age:(NSInteger)age;
- (void)replaceName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender;

// 声明自定义初始化方法
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age;

// 声明一个参数最全的自定义初始化方法
// 通常选择参数最多的方法作为:指定初始化方法
// 指定初始化方法:无论使用那一个初始化方法创建对象,都会执行此方法
- (instancetype)initWithName:(NSString *)name
                         age:(NSInteger)age
                      gender:(NSString *)gender
                     address:(NSString *)address
                       hobby:(NSString *)hobby;

@end

Person.m

#import "Person.h"

@implementation Person

// 实现给_name实例变量赋值的方法
- (void)setName:(NSString *)newName
{
    // 将参数的值,赋给执行此方法的对象的实例变量
    self->_name = newName;
}

- (void)setAge:(NSInteger)newAge
{
    // 在方法内部,可以直接写实例变量的变量名,‘self->’可省略
    _age = newAge;
}

- (void)setGender:(NSString *)newGender
{
    _gender = newGender;
}

// 实现取值的方法
- (NSString *)name
{
    return _name;  // or return self->_name;
}

- (NSInteger)age
{
    return _age;
}

- (NSString *)gender
{
    return _gender;
}

// 实现有2、3个参数的方法
- (void)setName:(NSString *)name age:(NSInteger)age
{
    _name = name;
    _age = age;
}

- (void)replaceName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender
{
    _name = name;
    _age = age;
    _gender = gender;
}

// 重写父类方法的实现
- (id)init
{
    _age = 19;
    return self;
}

// 实现自定义初始化方法
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age
{
    _name = name;
    _age = age;
    return self;
}

- (instancetype)initWithName:(NSString *)name
                         age:(NSInteger)age
                      gender:(NSString *)gender
                     address:(NSString *)address
                       hobby:(NSString *)hobby;
{
    _name = name;
    _age = age;
    _gender = gender;
    _address = address;
    _hobby = hobby;

    return self;
}

@end

Mother.h

#import <Foundation/Foundation.h>

@interface Mother : NSObject

@end

Mother.m

#import "Mother.h"

@implementation Mother

@end

Father.h

#import <Foundation/Foundation.h>

@interface Father : NSObject

@end

Father.m

#import "Father.h"

@implementation Father

@end

Child.h

#import <Foundation/Foundation.h>

@interface Child : NSObject
{
    NSString *_name;
}

- (void)setName:(NSString *)name;
- (NSString *)name;

@end

Child.m

#import "Child.h"

@implementation Child

- (void)setName:(NSString *)name
{
    _name = name;
}

- (NSString *)name
{
    return _name;
}

@end

Family.h

#import <Foundation/Foundation.h>
#import "Father.h"
#import "Mother.h"
#import "Child.h"

@interface Family : NSObject
{
    Father *_father;
    Mother *_mother;
    Child *_child;
}

- (void)setFather:(Father *)father;
- (Father *)father;

- (void)setMother:(Mother *)mother;
- (Mother *)mother;

- (void)setChild:(Child *)child;
- (Child *)child;

@end

Family.m

#import "Family.h"

@implementation Family

- (void)setFather:(Father *)father
{
    _father = father;
}
- (Father *)father
{
    return _father;
}

- (void)setMother:(Mother *)mother
{
    _mother = mother;
}
- (Mother *)mother
{
    return _mother;
}

- (void)setChild:(Child *)child
{
    _child = child;
}
- (Child *)child
{
    return _child;
}

@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Family.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        // OC中所有对象都要加 *

        // 创建对象
        Person *p = [[Person alloc] init];

        // 通过方法设置受保护的实例变量的值
        [p setName:@"laoda"];
        [p setAge:19];
        [p setGender:@"m"];

        // 通过方法取出受保护的实例变量的值
        NSString *n = [p name];
        NSInteger a = [p age];
        NSString *g = [p gender];
        NSLog(@"%@ %ld %@", n, a, g);

        Person *p1 = [[Person alloc] init];
        [p1 setName:@"Emoji"];

        // 创建对象
        Person *p2 = [[Person alloc] init];        
        NSLog(@"%ld", [p2 age]);

        // 使用自定义初始化方法创建对象
        Person *p3 = [[Person alloc] initWithName:@"��" age:10];

        // 创建Family对象
        Family *family = [[Family alloc] init];

        Father *f = [[Father alloc] init];
        [family setFather:f];

        Mother *m = [[Mother alloc] init];
        [family setMother:m];

        Child *c = [[Child alloc] init];
        [c setName:@"马小桃"];
        [family setChild:c];

        // 获取name,要一层一层查找
        NSLog(@"%@", [[family child] name]);

    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值