一、题目
2.创建一个Time类,具有以下成员:
(1)int类型字段hour, minute, second;
(2)int类型属性Hour, Minute, Second,其中,要求在set访问器对用户提供的值进行校验,Hour在0-23之间,Minute和Second均在0-59之间。被赋其它值时抛出异常,抛出方法:
throw new ArgumentOutOfRangeException(nameof(value), value,
$"{nameof(Hour)} must be 0 - 23");
(3)编写无参构造函数和三参构造函数。无参构造函数调用三参构造函数。为参数提供默认值0;
(4)编写Time Next(int hour, int minute, int second)函数,在现有时间上加上参数指定时间段后,返回新的时间信息;
(5)编写string ToUniversalString()方法,输出24时制的时分秒信息;
(6)编写string ToString()方法,加上override修饰,输出12时制的时间信息,并添加AM和PM后缀。
二、测试
1.测试代码如下
代码如下(示例):
var t1 = new Time2();
var t2 = new Time2(2);
var t3 = new Time2(21, 34);
var t4 = new Time2(12, 25, 42);
var t5 = new Time2(t4);
t5.Hour = 15;
var t6 = t5.Next(10, 40, 0);
Console.WriteLine("t1:");
Console.WriteLine($"{t1.ToUniversalString()}");
Console.WriteLine($"{t1.ToString()}\n");
Console.WriteLine("t2:");
Console.WriteLine($"{t2.ToUniversalString()}");
Console.WriteLine($"{t2.ToString()}\n");
Console.WriteLine("t3:");
Console.WriteLine($"{t3.ToUniversalString()}");
Console.WriteLine($"{t3.ToString()}\n");
Console.WriteLine("t4:");
Console.WriteLine($"{t4.ToUniversalString()}");
Console.WriteLine($"{t4.ToString()}\n");
Console.WriteLine("t5:");
Console.WriteLine($"{t5.ToUniversalString()}");
Console.WriteLine($"{t5.ToString()}\n");
Console.WriteLine("t6:");
Console.WriteLine($"{t6.ToUniversalString()}");
Console.WriteLine($"{t6.ToString()}\n");
2.测试结果
测试输出结果:
三、运行代码如下:
using System;
namespace Time
{
class Time
{
private int hour;
private int minute;
private int seconds;
public int Hour
{
get{return hour;}
set
{
if (hour >= 0 && hour <= 23)
{
hour = value;
}
else
throw new ArgumentOutOfRangeException(nameof(hour), hour, $"{nameof(hour)} must be 0 - 23");
}
}
public int Minute
{
get { return minute; }
set
{
if (minute >= 0 && minute <= 59)
{
minute=value;
}
else
throw new ArgumentOutOfRangeException(nameof(minute), minute, $"{nameof(minute)} must be 0 - 59");
}
}
public int Second
{
get { return seconds; }
set
{
if (seconds >= 0 && seconds <= 59)
{
seconds = value;
}
else
{
throw new ArgumentOutOfRangeException(nameof(seconds), seconds, $"{nameof(seconds)} must be 0 - 59");
}
}
}
public Time(int hour_Input=0,int minute_Input=0,int seconds_Input=0)
{
hour = hour_Input;
minute = minute_Input;
seconds = seconds_Input;
}
/*
* 因为构造函数是public,并且没有static,但是在类中我们又无法进行实例化,所以考虑类似继承的写法
*/
public Time():this(0,0,0)
{
}
public Time(Time time) :this(time.Hour,time.Minute,time.Second)
{
}
public Time Next(int hour,int minute,int seconds)
{
/*
* 因为你要考虑用户加上的时间可能很多,会产生溢出,要做进位处理,提高代码的健壮性
*/
return new Time((Hour + hour+(Minute + minute) / 60) % 24, (Minute + minute+ (Second + seconds) / 60) % 60, (Second + seconds) % 60);
}
public string ToUniversalString()
{
string time = hour + ":" + minute + ":" + seconds;
return time;
}
public override string ToString()
{
/*
* 重写ToString,返回12小时制
*/
String time_String;
time_String = hour > 12 ? hour - 12 + ":" + Minute + ":" + Second + "P.M" : hour + ":" + Minute + ":" + Second + "A.M";
return time_String;
}
}
class Program
{
static void Main(string[] args)
{
var t1 = new Time();
var t2 = new Time(2);
var t3 = new Time(21, 34);
var t4 = new Time(12, 25, 42);
var t5 = new Time(t4);//采用重新书写构造函数和利用字段的get属性进行解决
t5.Hour = 15;
var t6 = t5.Next(10, 40, 0);
Console.WriteLine("t1:");
Console.WriteLine($"{t1.ToUniversalString()}");
Console.WriteLine($"{t1.ToString()}\n");
Console.WriteLine("t2:");
Console.WriteLine($"{t2.ToUniversalString()}");
Console.WriteLine($"{t2.ToString()}\n");
Console.WriteLine("t3:");
Console.WriteLine($"{t3.ToUniversalString()}");
Console.WriteLine($"{t3.ToString()}\n");
Console.WriteLine("t4:");
Console.WriteLine($"{t4.ToUniversalString()}");
Console.WriteLine($"{t4.ToString()}\n");
Console.WriteLine("t5:");
Console.WriteLine($"{t5.ToUniversalString()}");
Console.WriteLine($"{t5.ToString()}\n");
Console.WriteLine("t6:");
Console.WriteLine($"{t6.ToUniversalString()}");
Console.WriteLine($"{t6.ToString()}\n");
}
}
}
四、输出结果如下:
难点总结
1.C#一个类有多个构造方法时,因为构造函数是public,并且没有static,但是在类中我们又无法进行实例化,所以考虑类似继承的写法2.让用户增加时间时要考虑进位的问题。