在没有静态引用的静态方法中修改另一个类中的类属性



我有一个包含自定义+逻辑的Time类,其中抛出的异常是Hours高于 23。我还有一个Workshift类,它有一个Day属性,我想在其中使用Time作为属性,但在附加逻辑上略有不同:当小时超过 23 小时时,更改日期,因此我创建了一个继承自TimeWorkingTime类,但改变了运算符的行为。起初,我以为我可以将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);
}
}
}

例如,高级目标是将一天从星期五设置为星期六,当有人尝试为具有 3 个Hours和 30 个MinutesTime增加 22 小时时。所以 {星期五, 22, 30} 变成 {星期六, 1, 30}。

因为重载的 WorkingTime 运算符是静态的,所以当它被调用时,它不会知道_workshiftReference是什么,因为它绑定到非静态对象的成员。

您可以将工作时间设为静态,并为日字段提供获取/设置函数。或者,您不能重载+ operator并创建一个具有三个参数的函数(时间 A、时间 B、工作班次工作)。

看起来您添加所有这些嵌套类只是为了使重载+ operator工作,所以我可能会重新研究您如何实现您正在尝试做的事情。也许只是常规功能会更好。

最新更新