我有一个包含自定义Time
逻辑的+
类,其中抛出的异常是Hours
高于23.我还有一个Workshift
类一个Day
属性,我希望使用Time
作为属性,但在添加逻辑方面略有不同:当小时数超过23时,更改日期,因此我可以使用WorkingTime
属性。我创建了一个继承自Time
的{{1}}类,但更改了运算符的行为。起初我以为我可以将Workshift
引用传递到WorkingTime
类并从那里控制它,但除此之外(最有可能)是一个灾难性的设计......我的问题是:我我不知道如何更改日期,因为重载运算符需要静态Workshift
引用,并且它不能是静态的,因为它可以按预期工作。我如何实现这一目标?
这是我到目前为止提出的代码:
public class Time
{
public ushort Hours { get; private set; }
public ushort Minutes { get; private set; }
public Time(ushort hours, ushort minutes)
{
if (hours > 23 || minutes > 59)
{
throw new ArgumentException("Invalid time specified");
}
Hours = hours;
Minutes = minutes;
}
public static Time operator +(Time a, Time b)
{
var hoursResult = a.Hours + b.Hours;
var minutesResult = a.Minutes + b.Minutes;
if (minutesResult > 59)
{
hoursResult += 1;
minutesResult = minutesResult - 60;
}
if (hoursResult > 23)
throw new Exception("Too many hours!");
ushort hours = (ushort)hoursResult;
ushort minutes = (ushort)minutesResult;
return new Time(hours, minutes);
}
}
public class Workshift
{
public Day Day { get; set; }
public WorkingTime StartHour { get; set; }
public WorkingTime EndHour { get; set; }
private class WorkingTime : Time
{
private Workshift _workshiftReference;
public WorkingTime(ushort hours, ushort minutes, Workshift workshift) : base(hours, minutes)
{
_workshiftReference = workshift;
}
public static WorkingTime operator +(WorkingTime a, WorkingTime b)
{
var hoursResult = a.Hours + b.Hours;
var minutesResult = a.Minutes + b.Minutes;
if (minutesResult > 59)
{
hoursResult += 1;
minutesResult = minutesResult - 60;
}
if (hoursResult > 23)
_workshiftReference.Day++; //how do I achieve this?
ushort hours = (ushort)hoursResult;
ushort minutes = (ushort)minutesResult;
return new WorkingTime(hours, minutes, _workshiftReference);
}
}
}
高级目标是,例如,设置从星期五到星期六的某一天,当有人试图向Time
添加3小时时,其中有Hours
和30 Minutes
。所以{星期五,22,30}成为{星期六,1月30日}。
答案 0 :(得分:0)
因为重载的WorkingTime运算符是静态的,所以当它被调用时,它将不知道_workshiftReference
是什么,因为它绑定到非静态对象的成员。
您可以将工作时间设为静态并为日期字段获取/设置功能。或者你不能重载+ operator
并使用三个参数(时间A,时间B,工作班次工作)创建一个函数。
看起来你正在添加所有这些嵌套类只是为了使重载+ operator
工作,所以我可能会重新研究你如何实现你想要做的事情。也许只是常规功能会更好。