Object-C的多态与集成

实验目的

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

实验内容

给定三个用户张三,李四,王五。
给定四种语言英语、日语、德语、西班牙语。
实现场景输出(log形式即可):随机选择一个用户和一种语言学习,从当前日期开始,随机产生时间进行学习,输出学习进度直至学习完毕。每个语言共8个tour,每个tour共4个unit,每次学习一个unit。
要求:

  1. 随机选定人名、语言后,一次性输出所有的结果。
  2. 随机时间指的是每次随机1-5天,每次学习时间在前一次的基础上加上刚刚随机出的天数。
  3. 需要用到多态。
    输出例子: 张三 某年某月某日 学习日语 tour 1 unit 1。

代码

1. main函数

在main函数中要完成输出部分。输出的人物和语言都是随机的,学习日期也是随机的。每次学习1~5天,依次完成tour1到tour8的学习,并借用类中的函数。

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "Person.h"
#import "Language.h"

NSString * getDate(NSInteger sum_day) {
	NSDate * date = [NSDate dateWithTimeIntervalSinceNow : sum_day * 24 * 60 * 60];
	NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
	formatter.dateFormat = @"yyyy年MM月dd日";
	NSString * day = [formatter stringFromDate : date];
	return day;
}//获取每次开始学习的日期

int main(int argc, char * argv[]) {
	int random1 = arc4random() % 4 + 1;
	int random2 = arc4random() % 3 + 1;//获取随机数
	Language * language;
	Person * person;
	switch (random1){
	case 1:
		language = [[English alloc] init];
		break;
	case 2:
		language = [[Japanese alloc] init];
		break;
	case 3:
		language = [[German alloc] init];
		break;
	default:
		language = [[Spanish alloc] init];
	}
	switch (random2) {
	case 1:
		person = [[S1 alloc] init];
		break;
	case 2:
		person = [[S2 alloc] init];
		break;
	case 3:
		person = [[S3 alloc] init];
		break;
	}//随机选择人和语言
	NSInteger random_study = 0;
	NSInteger sum_day = 0;
	while (![language isFinish]) {
		[language learnOneUnit];
		if ([language getTour] == 8) 
			break;
		random_study = arc4random() % 5 + 1;//随机学习一到五天
		NSString * day = getDate(sum_day);
		sum_day += random_study;
		NSLog(@"%@ %@ 学习%@ tour %ld unit %ld", [person getName], day, [language getName], [language getTour] + 1, [language getUnit]);
	}//一直学习,直到学满8个tour
}
2. Person.h
#ifndef Person_h
#define Person_h
@interface Person : NSObject{
}
-(NSString *)getName;
@end

@interface S1 : Person{
    
}
@end

@interface S2 : Person{
    
}
@end

@interface S3 : Person{
    
}
@end
#endif /* Person_h */

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
3. Language.h
#ifndef Language_h
#define 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
#endif /* Language_h */
Language.m

该类负责语言的学习,专管四门语言,并定义了每门语言每个tour依次学习5个unit,并负责该次学习的语言,tour以及unit。

#import <Foundation/Foundation.h>
#import "Language.h"

@implementation Language
- (void)learnOneUnit{
	unit++;
	if (unit == 5) {
		unit = 1;
		tour++;
	}
}//每个tour依次学习5个unit
-(NSInteger)getTour{
	return tour;
}
-(NSInteger)getUnit{
	return unit;
}
-(bool)isFinish{
	if (tour == 8) 
		return YES;
	return NO;
}//学满8个tour时,结束该语言学习
-(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

运行结果

总结与体会

这是我第一次用Object-C进行编程,之前在课堂上听老师讲相关知识时,觉得虽然该语言有自己很独特的地方,但是因为之前已经积累了很多c的编程经验,所以应该可以立即上手。但是真正实操起来才发现好难呀。或许因为是第一次用这门语言吧,读题时认为这道题不难,但是写起类来,我发现自己并不能很好地将方法整洁地归到各个类里面。。最后花了很多很多时间,还和身边的小伙伴一起讨论了一下,才顺利完成。希望经过这次实验对Object-C语言的熟悉,以后能够越来越好呀~加油!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值