Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在没有静态引用的静态方法中修改另一个类内的类属性_C#_Class_Inner Classes - Fatal编程技术网

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

C# 在没有静态引用的静态方法中修改另一个类内的类属性,c#,class,inner-classes,C#,Class,Inner Classes,我有一个Time类,它包含自定义+逻辑,当Hours大于23时抛出异常。我还有一个Workshift类,它有一个Day属性,我想使用Time作为属性,但在逻辑上有一个细微的区别:当小时数超过23时,更改日期,因此我创建了一个WorkingTime类,它继承自Time,但会改变操作员的行为。起初,我认为我可以将Workshift引用传递到WorkingTime类中,然后从那里控制它,但是,除了这(很可能)是一个灾难性的设计之外。。。我的问题是:我不知道如何更改日期,因为重载操作符需要一个静态Wor

我有一个
Time
类,它包含自定义
+
逻辑,当
Hours
大于23时抛出异常。我还有一个
Workshift
类,它有一个
Day
属性,我想使用
Time
作为属性,但在逻辑上有一个细微的区别:当小时数超过23时,更改日期,因此我创建了一个
WorkingTime
类,它继承自
Time
,但会改变操作员的行为。起初,我认为我可以将
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小时时,该时间有22小时
和30分钟
。因此{Friday,22,30}变为{Saturday,1,30}。

因为重载的WorkingTime操作符是静态的,当调用它时,它将不知道
\u workshift reference
是什么,因为它绑定到非静态对象的成员

您可以将工作时间设置为静态,并为day字段提供get/set函数。或者,您无法使
+操作员超负荷
,并使用三个参数(时间a、时间B、工作档工作)生成一个函数


看起来您添加所有这些嵌套类只是为了让重载的
+运算符
工作,所以我可能会重新研究如何实现您尝试执行的操作。也许只使用常规函数会更好。

您从哪里知道运算符重载需要静态类?运算符重载方法需要是静态的,但包含它的类不需要。这是一个混乱的局面,嵌套类没有任何指向拥有它们的实例的链接。我们也不知道什么是
,所以我们无法告诉您如何“增加”.@Amai您是否使用过
系统.DateTime
?@Amai如果您有一个大锤子可以轻松完成工作,那么花时间自己制作一个稍小的锤子并不总是最好的选择,但我喜欢保持效率,不浪费时间解决早在我之前就已经解决和解决的问题(以及比我聪明的人解决和解决的问题)。幸运的是,创建一个属性静态会使它在该类的每个实例之间共享,这肯定不是我想通过这些类实现的。至于going-for-methods方法:我正试图使底层实现尽可能无缝,这样使用它的人就不必知道底层细节,只需使用该类,而不必疑惑“为什么我必须传递这样一个对象?”?“如果只是想增加15到10个小时,这是没有意义的”。