2011-05-18 66 views
1

让我开始说明我知道C#中的赋值运算符不能被重载/覆盖。但是,如果我有像这样一类:替代运算符重载

public class Time 
{ 

    private int Hour, Minute; 
    public int minutes; 

    public Time(int m) 
    { 
     this.minutes = m; 
     this.Hour = m/60; 
     this.Minute = m % 60; 
    } 

    public Time(int hh, int mm) 
    { 
     this.minutes = 60 * hh + mm; 
     this.Hour = hh; 
     this.Minute = mm; 
    } 

    public static explicit operator Time(int i1) 
    { 
     return new Time(i1); 
    } 

} 

两件事情:

1)是在底部的显式转换超载有必要吗?

2)我想要做

Time newTime = 510; 

,并有小时分钟反映新分钟。未做另一个目的,是让像这样的功能的唯一途径:

public void changeminutes(int m) 
    { 
     this.minutes = m; 
     this.Hour = m/60; 
     this.Minute = m % 60; 
    } 

,并做到这一点:

Time newTime = new Time(); 
newTime.changeminutes(510); 

编辑:

我也许应该提到,我仍然在学习C#。很多你的建议都飞过了我的脑海。抱歉。

next编辑: 这不一定是关于时间。我只是用它来说明我的例子。

+0

难道你不是指'隐式'而不是'显式'吗? – pickypg 2011-05-18 17:48:50

+1

我推荐*不*执行'Time newTime = 510;'功能。这并不是立即显而易见的。在你的最终代码片段中,我知道没有时间实现的完整知识,代码正在做什么。如果代码不可用,'Time newTime = 510;'将是一个巨大的?在代码的读者部分。 – Amy 2011-05-18 17:48:56

+1

为了达到良好的设计效果,我建议遵循'DateTime'和'TimeSpan'类中的模式。 – Amy 2011-05-18 17:50:35

回答

3

您可以创建从intTime的隐式转换。

但是,我建议反对它。
除非它们在等效类型之间(例如,intlong),否则隐式转换最终会产生很多混淆。
此外,它不是显而易见的,这应该意味着分钟而不是秒。

可以使用扩展方法创建一个更加美好的语法:

Time t = 510.Minutes(); 
+0

忽略混淆元素,我是否真的需要过载转换操作符? – Andrew 2011-05-18 18:08:46

+0

@Andrew:你是什么意思? – SLaks 2011-05-18 18:24:43

+0

我是否需要定义转换(即我的示例中的“public static explicit operator Time”),还是“Time newTime = 510”没有它? – Andrew 2011-05-18 18:27:48

1

它看起来像你试图做一个参考类型表现得像一个值类型,这是......嗯,很棘手。如果你真的不想使用此构造函数(并解释这是为什么能帮助我们回答),你可以使用一个静态的“工厂”的方法:

public static Time FromMinutes(int m) 
{ 
    return new Time(m); 
} 

而且使用这样的:

var t = Time.FromMinutes(510); 

这与TimeSpan class允许您做的相似。

+0

+1不确定第一部分,但第二部分回答OP的问题“这是唯一的方法......” – mellamokb 2011-05-18 17:50:59

+0

TBH,我还在学习C#。这更多的是为我学习,而不是我需要知道的一些练习。只是好奇,如何在没有在流程中创建新对象的情况下完成它(我来自非垃圾收集语言)。这不一定是时间,我只是用它来说明我的例子。 – Andrew 2011-05-18 17:57:06

+0

@Andrew:无论你做什么,你都不会制造额外的物品。 – SLaks 2011-05-18 17:58:17

0

对于你区分的隐式转换的工作,但...

转换不被使用时,你失去的数据,甚至语义像在这种情况下。你知道这个数字将成为一个时间,但你不知道该数字将被转换成哪个单位时间。

如果有人要阅读代码,它不会查看数字代表的内容而无需查看Time类的内部定义。想想看是否在外部项目中。调试地狱? :)

0

首先,要使用implicit转换来实现Time x = 123;,但其他人指出,因为它是目前尚不清楚是什么数字代表可能是一个糟糕的设计选择(大多数人会认为Unix时间戳)。

其次,为什么不使用Minutes属性来设置分钟数,并简单地将该值转换为适当的值,同时更改Hours?

time.Minutes = 510; 

// in class def: 

public int Minutes 
{ 
    get { return minutes; } 
    set 
    { 
     hours = value/60; 
     minutes = value % 60; 
    } 
}