在静态方法中修改另一个类中的类属性,而不使用静态引用

时间:2018-04-26 21:10:25

标签: c# class inner-classes

我有一个包含自定义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日}。

1 个答案:

答案 0 :(得分:0)

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

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

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