2012-02-15 56 views
3

看,我知道靜態類不能繼承或實現。問題是「什麼是正確的C#+ OOP模式來實現這個?」。 「This」描述如下:如何在靜態類中使用多態或繼承?

我想爲一組類定義和實現的通用集合,其中除一個類型之外的所有類型都應該是靜態的。也就是說,我要做出一些武斷基地轉換器,其中每個具有完全相同的四個成員:

// Theoritical; static classes can't actually implement 
interface IBaseConverter { 
    int Base { get; } 
    char[] Glyphs { get; } 
    int ToInt(string value); 
    string FromInt(int value); 
} 

// AND/OR (interface may be superfluous) 
public class BaseConverter : IBaseConverter{ 
    public BaseConverter(int Base, char[] Glyphs) { 
     this.Base = Base; 
     this.Glyphs = Glyphs; 
    } 
    public int Base { get; private set; } 
    public char[] Glyphs { get; private set;} 
    public int ToInt(string value) { // shared logic... 
    public string FromInt(int value) { // shared logic... 
} 

他們還可以共享基礎上的Base價值和字形的有序集合完全相同的實現邏輯。例如Base16Converter可能有Base = 16glyphs = { '0', '1', ... 'E', 'F' }。我相信FromIntToInt是不言自明的。顯然,我不需要實現基於16的轉換器,但是我需要爲特定於行業的基礎36(0 - ZCode 39的字形)實現一個轉換器。與內置的轉換和字符串格式化功能(如[Convert]::ToInt32("123",16))一樣,這些都是強調靜態方法 - ,當基礎和字形預先確定時

我想保持可與任意的字形和底座,如被初始化實例的版本:

BaseConverter converter = new BaseConverter(7, new[]{ 'P', '!', 'U', '~', 'á', '9', ',' }) 
int anumber = converter.ToInt("~~!,U") // Equals 8325 

但我也希望有一個靜態類的Base36Code39Converter。把這個的另一種方式是,任何static實施者只是硬編碼的基礎和字形:

// Theoritical; static classes can't inherit 
public static class Base36Code39Converter : BaseConverter { 
    private static char[] _glyphs = { '0', '1', ... 'Z' }; 
    static Base36Code39Converter : base(36, _glyphs) { } 
} 

我明白爲什麼這不會對編譯器的工作 - 沒有虛函數表的靜態方法和所有。我知道在C#中,靜態類不能實現接口或從任何東西(除了對象)繼承(請參見Why Doesn't C# Allow Static Methods to Implement an Interface?,Why can't I inherit static classes?)。

那麼到底什麼是的「右」C#+ OOP模式來實現這個?

+0

這不是[單件模式](http://www.dofactory.com/Patterns/PatternSingleton.aspx)的工作嗎?另外,這裏有一篇關於[Singleton VS Static Class](http://www.dotnetperls.com/singleton-static)的好文章。 – 2012-02-15 14:46:36

回答

1

答案是Singleton模式。例如參見Implementing Singleton in C#

Luiggi門多薩提供了這個答案,我標記爲答案,但後來因爲某種原因刪除了它。我爲了完整而重新發布它。

+0

感謝您在此提供完整性。 – RvdV79 2017-04-26 09:32:26

1

爲什麼你想讓它變成靜態的?

Singleton似乎是你在找什麼。

+1

儘管_singleton設計pattern_是我正在尋找的模式(正如Luiggi所指出的),但您鏈接到維基百科消歧頁面更多地顯示了這個術語爲什麼會令人困惑:它也意味着一組一個,它也在.NET中實現4.0+作爲Tuple 。 MDSN本身同時具有描述[** singleton design pattern **](http://msdn.microsoft.com/zh-cn/library/ff650316.aspx)的文檔,並描述了[** Tuple class **]( http://msdn.microsoft.com/en-us/library/dd386941.aspx)爲「1元組或** singleton **」。「 – 2012-02-15 15:58:33

+0

我應該看看我鏈接到更好:) – penartur 2012-02-15 17:51:44

2

你總是可以使用組合。在這種情況下,您的靜態類將有相應的轉換器的一個實例,只是代理,任何來電:

public static class Base36Code39Converter 
{ 
    private static BaseConverter _conv = 
     new BaseConverter(36, new[]{ '0', '1', ... 'Z' }); 

    public static int ToInt(string val) 
    { 
     return _conv.ToInt(val); 
    } 
} 
2

你要去的方向......與其說是一個好主意。

我建議你模仿System.Text.Encoding提供的模式。

它具有Encoding類型的公共靜態屬性,它們是用於不同類型的文本編碼的Encoding類的標準實現。

  • ASCII
    • 獲取的ASCII(7位)字符集編碼。
  • BigEndianUnicode
    • 獲取使用大端排序的字節順序的UTF-16格式編碼。
  • 默認
    • 獲取操作系統的當前ANSI代碼頁的編碼。
  • 的Unicode
    • 獲取用於使用所述小端排序的字節順序的UTF-16格式編碼。
  • UTF32
    • 獲取用於使用所述小端排序的字節順序的UTF32格式的編碼。
  • UTF7
    • 獲取的UTF7格式的編碼。
  • UTF8
    • 獲取的UTF8格式的編碼。

在你的情況,你會提供一個抽象基類,而不是一個接口,並揭露共同實現的靜態屬性。

開發人員可以輕鬆訪問您提供的通用轉換器的實現,或者他們可以實現自己的實現。

+0

+1 - 雖然Luiggi提供了一個明確的理論解釋的鏈接的直接答案,這是BCL中使用的模式的一個很好的例子。 – 2012-02-15 14:58:48

+0

@jmh_gr:呃,它並不是真的是一樣的,但是無論如何,你會明白這一點,在這種情況下,它總是很好地看待類似模式的框架,因爲它們經過深思熟慮並且對所有人都熟悉使用BCL的開發人員。 – Will 2012-02-15 15:00:24