2011-11-16 22 views
0

我正在寫一個具有不同精度級別的結構的庫,例如具有整數座標的點和具有浮點座標的點。 .NET使用Point作爲其整體結構,而PointF作爲浮點型變體,但我最近偶然發現了Java的等價物,它使用Point和嵌套的Point.Double我應該在層次結構中構造具有不同精度級別的類型嗎?

我喜歡定義這樣類型的想法:

struct Point { 
    // integral implementation 

    public struct Double { 
     // double floating-point implementation 
    } 
    public struct Long { 
     // 64-bit implementation 
    } 
    // etc.. 
} 

我不喜歡的是重新定義「雙」和「龍」父類型中。有沒有人使用過這種模式,並發現由此產生的更多問題?或者我應該堅持與Point,PointD,& PointL

+0

只是不言自明的,你不能從結構繼承,所以你*有*到採取MS方法。 – tcarvin

+0

@tcarvin - 糟糕,我的意思是嵌套類,而不是子類。發佈的示例代碼*在C#中是有效的。 – dlras2

+0

如果這是一個結構或一個類,它們之間有很大的區別。你的代碼示例是一個結構體,因此當用戶有一個類型爲Point的變量時,* Both * Point.Double和Point.Long都存在(佔用內存)。至少在課堂上你可以防止這種情況發生。 – tcarvin

回答

3

我鄙視這個想法。我認爲嵌套類是包含類的實現細節,並且帶有double字段的點不是具有int字段的點的實現細節。嵌套類用於封裝在包含類之外沒有意義的實現細節。在這裏,情況並非如此。不要這樣做。

另外,我不明白爲什麼你只是不會與命名約定去:

struct Int32Point 
struct Int64Point 
struct SinglePoint 
struct DoublePoint 
+0

如果我將它們命名爲'Point.Int32','Point.Double'等,那麼該怎麼辦?這似乎遵循您所描述的「實現細節」約定。 – dlras2

+0

玫瑰的任何其他名稱.... – jason

+0

然後,我有點困惑於「實現細節」,因爲它看起來像你有不同的「實現」的「點」作爲子類。 – dlras2

相關問題