自定义时间类在编程中的应用

在进行软件开发时,经常需要处理时间相关的数据。例如,需要跟踪CD中每首歌曲的长度,或者计算一个程序的运行时间。在这些情况下,可能需要一个能够精确表示时间的类。标准的编程语言提供了一些内置的时间处理功能,但它们往往不能满足所有需求。因此,可能会考虑创建一个自定义时间类

正在为Visual Basic和VisualC#编写一个培训课程。在这个课程中,需要提供多个示例程序,因此已经连续编写了大约两个月。这个课程的核心项目是一个CD跟踪程序,随着每个培训部分的完成,这个程序将被扩展和增强。

在第一部分“基础”中,使用了一个结构体来保存艺术家名称和专辑标题,并将数据保存到文本文件中。在第二部分“面向对象编程”中,将程序升级为使用类和XML文件。这部分存储了艺术家、专辑、歌曲标题、长度、发行年份,并计算总长度。

在第三部分“图形用户界面编程”中,将程序转换为图形用户界面,并添加了专辑封面和歌词。最后,在第四部分“数据库编程”中,将再次升级程序,将其转换为使用数据库。

代码使用

自定义的时间类添加到项目中,它提供了以下功能:

属性:

  • Hours - 一个整数值,用于保存小时部分。
  • Minutes - 一个整数值,用于保存分钟部分,范围是0到59。
  • Seconds - 一个整数值,用于保存秒部分,范围是0到59。
  • Sign - 一个整数值,用于保存时间的符号。范围是-1表示负数,0表示零,+1表示正数。

构造函数:

  • New() - 无参数构造函数,设置默认值为+00:00:00。
  • New(seconds) - 参数化构造函数,将秒转换为小时、分钟和秒。
  • New(minutes, seconds) - 参数化构造函数,创建形式为S00:MM:SS的值,其中S是数字的符号。
  • New(hours, minutes, seconds) - 参数化构造函数,创建形式为SHH:MM:SS的值,其中S是符号。
  • New(sign, hours, minutes, seconds) - 参数化构造函数,与前面的构造函数类似,但可以显式设置符号。
  • New(string) - 参数化构造函数,将字符串解析为时间,使用冒号(:)作为分隔符。如果字符串中缺少参数,则从右到左填充值。
  • New(string, delimiter) - 参数化构造函数,与前面的构造函数类似,但可以提供显式的分隔符用于解析字符串。

关系运算符:

  • CompareTo(time) - 实现System.IComparable(Of Time).CompareTo。
  • Compare(time, time) - 实现System.Collections.Generic.IComparer(Of Time).Compare。
  • Equals1(time) - 实现System.IEquatable(Of Time).Equals。
  • GetHashCode() - 因为有一个Equals()方法。

重载运算符:

  • - (取反)
  • + (加法) - (减法) * (乘法) / (除法) - 编写这个类的主要原因。

标准转换方法:

  • ToShort ToUShort ToInt16 ToUInt16 ToInteger ToUInteger ToInt32 ToUInt32 ToLong ToUlong ToInt64 ToUint64 - 标准转换方法。
  • ToSingle ToDouble ToDecimal - 这些数字的整数部分转换为小时和分钟,而秒数来自小数部分(例如30秒=0.5)。
  • ToTime() 和 CType() - 将转换为几乎所有其他可以转换的类型。

其他数学运算:

  • Abs() - 绝对值。
  • Min() 和 Max() - 最小值和最大值。
  • Ceiling()、Floor() 和 Round() - 这些方法像标准四舍五入方法一样工作,并且四舍五入到分钟。
  • ToString() - 输出#0:00:00或-#0:00:00。

在可能的缩小转换中,使用了一些范围检查,并在超出范围时抛出OverflowException。使用了标准异常,所以可以将代码轻松地集成到程序中。

代码示例

以下是一个简单的测试程序,它通过了所做的有限测试,但广泛的测试可能会(并且可能会)揭示缺陷。如果发现一个,请告诉!

Module TestTimeClass Sub Main() Dim i As Time Dim j As New Time(275) Dim k As New Time("4:15") i = j + k Console.WriteLine(i.ToString()) i = k - j Console.WriteLine(i.ToString()) Console.WriteLine(Time.ToDecimal(i)) If k < j Then Console.WriteLine("k is smaller than j.") Else Console.WriteLine("j is smaller than k.") End If Console.ReadLine() End Sub End Module
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485