【ios编程】objective-c 多态与继承

实验目的

  1. 学习掌握Objective-C语法,掌握基础字符串操作。
  2. OO知识——多态与继承

实验内容

给定三个用户张三,李四,王五。

给定四种语言英语、日语、德语、西班牙语。

实现场景输出(log形式即可):随机选择一个用户和一种语言学习,从当前日期开始,随机产生时间进行学习,输出学习进度直至学习完毕。每个语言共8个tour,每个tour共4个unit,每次学习一个unit。

要求:

  • 随机选定人名、语言后,一次性输出所有的结果。
  • 随机时间指的是每次随机1-5天,每次学习时间在前一次的基础上加上刚刚随机出的天数。
  • 需要用到多态。

输出例子: 张三 某年某月某日 学习日语 tour 1 unit 1。

代码

定义类Person,声明一个方法getName,并根据不同人的名称进行多态实现:

// Person.h
@interface Person : NSObject {
}
-(NSString *) getName;
@end

@interface S1 : Person {
}
@end

@interface S2 : Person {
}
@end

@interface S3 : Person {
}
@end
// Person.m
#import <Foundation/Foundation.h>
#import "Person.h"

@implementation Person
- (NSString *)getName{
    return @"";
}
@end

@implementation S1
- (NSString *)getName{
    return @"张三";
}
@end

@implementation S2
- (NSString *)getName{
    return @"李四";
}
@end

@implementation S3
- (NSString *)getName{
    return @"王五";
}
@end

定义类Language:

  • 每个语言共8个tour,每个tour共4个unit(成员变量)
  • 包含:
    • 每次学习1个unit的方法learnOneUnit;
    • 获取tour和unit的方法getTour / getUnit;
    • 判断当前语言是否全部学习完毕的方法isFinish;
    • 获取语言名称的方法getName。
// Language.h
@interface Language : NSObject {
    NSInteger tour;
    NSInteger unit;
}

-(void) learnOneUnit;
-(NSInteger) getTour;
-(NSInteger) getUnit;
-(bool) isFinish;
-(NSString *) getName;

@end

@interface English : Language{
}
@end

@interface Japanese : Language{ 
}
@end

@interface German : Language{  
}
@end

@interface Spanish : Language{
}
@end
// Language.m
#import <Foundation/Foundation.h>
#import "Language.h"

// 对于每一个tour,依次学习5个单元
@implementation Language
-(void) learnOneUnit{
    unit++;
    if(unit == 5) {
        unit = 1;
        tour ++;
    }
}

-(NSInteger) getTour {
    return tour;
}

-(NSInteger) getUnit {
    return unit;
}

// 当tour=8时,表示当前语言学习完毕
-(bool) isFinish {
    if(tour == 8) return YES;
    return NO;
}

-(NSString *) getName{
    return @"";
}

@end

@implementation English
-(NSString *) getName{
    return @"英语";
}
@end

@implementation Japanese
-(NSString *) getName{
    return @"日语";
}
@end

@implementation German
-(NSString *) getName{
    return @"德语";
}
@end

@implementation Spanish
-(NSString *) getName{
    return @"西班牙语";
}
@end

主函数:

  • 计算学习日期
  • 随机选择一个人和一门语言,从当前时间开始学习,每次学习1个unit,耗时1~5天。
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "Person.h"
#import "Language.h"

// 获取学习日期
NSString * getDate(NSInteger days) {
    // 从现在开始加上已经学习的天数
    NSDate * date = [NSDate dateWithTimeIntervalSinceNow:days*24*60*60];
    // 使用NSDateFormatter进行日期的格式化
    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyy年MM月dd日";
    NSString * resultDate = [formatter stringFromDate:date];
    return resultDate;
}

int main(int argc, char * argv[]) {
    Language * language;
    Person * person;
    
    // 随机选择一个人和一种语言
    int randomNum1 = arc4random() % 3 + 1;
    int randomNum2 = arc4random() % 4 + 1;
    switch(randomNum1) {
        case 1:
            person = [[S1 alloc] init];
            break;
        case 2:
            person = [[S2 alloc] init];
            break;
        case 3:
            person = [[S3 alloc] init];
            break;
    }
    switch(randomNum2){
        case 1:
            language = [[English alloc] init];
            break;
        case 2:
            language = [[Japanese alloc] init];
            break;
        case 3:
            language = [[German alloc] init];
            break;
        case 4:
            language = [[Spanish alloc] init];
    }
    
    NSInteger randomDays = 0;
    NSInteger sum = 0;
    // 还未完成学习时
    while(![language isFinish]) {
        [language learnOneUnit];
        if([language getTour] == 8)
            continue;
        NSString * date = getDate(sum);
        // 每次随机学习1~5天
        randomDays = arc4random() % 5 + 1;
        sum += randomDays;
        // 输出
        NSLog(@"%@ %@ 学习%@ tour %ld unit %ld",[person getName],date,[language getName],[language getTour]+1,[language getUnit]);
    }
}

运行结果

在这里插入图片描述
在这里插入图片描述

实验总结

本次实验第一次进行了objective-c语言的编程。初次接触,感觉objective-c相对来说是比较难的。一节课堂上就有许多的知识点,课下需要花时间进行理解。尤其是objective-c消息传递的性质,理解起来是有一定难度的。

在进行本次实验时,也遇到了一些困难。比如一开始对于多态性的理解不足,写Person类时直接将name作为成员变量,再使用property。这样下来发现思路非常复杂,而且难以实现要求。其实只需要将name的设置声明为一个方法并进行多态实现即可。

本次实验还用到了日期操作,在这个地方卡了比较久,最后终于找到可以参照的代码。其中NSDateFormatter可以用来进行日期的格式化。

总体来说,第一次objective-c编程的知识虽然不算多,但是比较重要。对于初步理解objective-c有很大的作用,收获也比较多。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值