博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC继承专题
阅读量:6537 次
发布时间:2019-06-24

本文共 2846 字,大约阅读时间需要 9 分钟。

hot3.png

FJEmployee.h

#import <Foundation/Foundation.h>

//objectC创建枚举类型;

typedef NS_ENUM(NSUInteger,FJEmployeeType ){

    FJEmployeeTypeManager,

    FJEmployeeTypeEngineer,

    FJEmployeeTypeSalesman} ;

FJEmployee : NSObject

/**这是一个父类,员工的共同属性姓名和工资*/

@property (nonatomic,copy) NSString *name;

@property (nonatomic,readonly) double salary;

/**隐藏多种员工子类型的细节,只暴露员工接口给用户调用*/

+ (instancetype) employeeWithType:(FJEmployeeType) typeName;


FJEmployee.m

#import "FJEmployee.h"

#import "FJManager.h"

#import "FJEngineer.h"

#import "FJSaledman.h"

@implementation FJEmployee

//类簇(class - cluster

//GoF设计模式:静态工厂方法模式

//GoF设计模式(23种设计模式)

//创建型模式:单例,工厂

//结构型模式:适配器,门面,装潢,桥梁                        

//行为型模式:观察者,代理

//单一职责,开闭原则,依赖倒转原则,里氏替换原则,接口隔离原则,合成聚合复用,迪米特原则

+ (instancetype)employeeWithType:(FJEmployeeType)typeName{

    FJEmployee *employee = nil;

    switch (typeName) {

        case FJEmployeeTypeManager:

            employee = [[FJManager alloc]init];

            break;

        case FJEmployeeTypeEngineer:

            employee = [[FJEngineer alloc] init];

            break;

        case FJEmployeeTypeSalesman:

            employee = [[FJSaledman alloc]init];

            //employee = [FJSaledman new];new表示用默认的初始化方法,带参数的初始化方法就不可以使用new

            break;

    }

    return employee;

}


FJManager.h

#import "FJEmployee.h"

//#import "FJEmployee.h"

@interface FJManager : FJEmployee

@end


FJManager.m

#import "FJManager.h"

/**部门经理的工资固定为10000*/

@implementation FJManager

- (double)salary{

    return 10000;

}

@end


FJEngineer.h

#import "FJEmployee.h"

/**工程师根据工作时间计算工资*/

@interface FJEngineer : FJEmployee

@property (nonatomic,strong) NSNumber *workinghour;

@end


FJEngineer.m

#import "FJEngineer.h"

@implementation FJEngineer

/**假设每个小时200*/

- (double)salary{

    return  200*_workinghour.doubleValue;

}

@end


FJSalsman.h

#import "FJEmployee.h"

@interface FJSaledman : FJEmployee

/**销售人员根据销售额提成*/

@property (nonatomic,strong) NSNumber *sales;

@end


FJSalaman.m

#import "FJSaledman.h"

@implementation FJSaledman

-(double)salary{

    

    return 1500 + _sales.doubleValue*0.05;

}

@end


main.m

#import <Foundation/Foundation.h>

#import "FJManager.h"

#import "FJSaledman.h"

#import "FJEngineer.h"

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

    @autoreleasepool {

        

        NSArray *names = @[@"luhan",@"fanjuan",@"qianxi"];

    

        NSMutableArray *empArray = [NSMutableArray array];

        

        for (NSString *name in names) {

           

        FJEmployee *emp = [FJEmployee employeeWithType:arc4random() % 3];

        

            emp.name = name;

            [empArray addObject:name];

            

        }

        

        for (FJEmployee *emp in empArray) {

            

            if ([emp isKindOfClass:[FJEngineer class]]) {

                

                printf("请输入%s的工作时间:",emp.name.UTF8String);

                int hour;

                scanf("%d",&hour);

                //通过选择器去执行对象的方法

        [emp performSelector:@selector(setWorkinghour:) withObject:@(hour)];

            

            }

               else if([emp isKindOfClass:[FJSaledman class]]){

                   

                printf("请输入%s的销售额:\n",emp.name.UTF8String);

                double sales;

                scanf("%lf",&sales);

               

            [emp performSelector:@selector(setSales:) withObject:@(sales)];

                

            }

            printf("%s本月的工资是$%lf\n",emp.name.UTF8String,emp.salary);

        }

        

    }

    return 0;

}

转载于:https://my.oschina.net/luhoney/blog/645597

你可能感兴趣的文章
c++ Constructor FAQ 继续
查看>>
事务之六:spring 嵌套事务
查看>>
C#:路径
查看>>
iOS图片加载速度极限优化—FastImageCache解析
查看>>
PHP中的一些新特性
查看>>
I.MX6 Android mmm convenient to use
查看>>
[CareerCup] 13.9 Aligned Malloc and Free Function 写一对申请和释放内存函数
查看>>
55、Android网络图片 加载缓存处理库的使用
查看>>
svn文件提交时强制写注释
查看>>
【转载】千万级规模高性能、高并发的网络架构经验分享
查看>>
OC基础--OC中的类方法和对象方法
查看>>
ubuntu samba服务器多用户配置【转】
查看>>
母线的种类与作用是什么(转)
查看>>
【Xamarin 挖墙脚系列:IOS 开发界面的3种方式】
查看>>
Atitit.工作流系统的本质是dsl 图形化的dsl 4gl
查看>>
I.MX6 Android USB Touch eGTouchA.ini文件存放
查看>>
4-5-创建索引表-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版
查看>>
java 操作 RabbitMQ 发送、接受消息
查看>>
go run main.go undefined? golang main包那点事
查看>>
从零开始写一个npm包,一键生成react组件(偷懒==提高效率)
查看>>