我發現我可能使用使用隱式轉換宣佈和強制先決條件。試想一下:我是否應該使用隱式轉換來強制執行前提條件?
object NonNegativeDouble {
implicit def int2nnd(d : Double) : NonNegativeDouble = new NonNegativeDouble(d)
implicit def nnd2int(d : NonNegativeDouble) : Double = d.v
def sqrt(n : NonNegativeDouble) : NonNegativeDouble = scala.math.sqrt(n)
}
class NonNegativeDouble(val v : Double) {
if (v < 0) {
throw new IllegalArgumentException("negative value")
}
}
object Test {
def t1 = {
val d : Double = NonNegativeDouble.sqrt(3.0);
printf("%f\n", d);
val n : Double = NonNegativeDouble.sqrt(-3.0);
}
}
暫時忽略例子的實際虛標:我的觀點是,子類NonNegativeDouble表達了一個功能只類的值的整個範圍的子集的概念。
首先是這樣的:
- 一個好主意,
- 一個壞主意,或
- 明顯的想法別人都已經知道
其次,這將是最有用的使用基本類型,如Int和String。當然,這些類是最終的,那麼是否有一種好方法不僅可以在函數中使用受限類型(這是第二種隱含的方式),還可以將所有方法委託給基礎值(缺少實現每個委託)?
我發現了一種方法,如何在csharp中做到這一點。這是我的原型https://gist.github.com/1306491 – 2011-10-23 09:51:13