2011-05-18 58 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; 
    } 
}