2012-02-15 14 views
3

私は静的クラスは継承も実装もできないことを知っています。質問は "これは何を右C#+ OOPのパターンはこれを実装する"ですか?静的クラスでポリモーフィズムまたは継承を使用するにはどうすればよいですか?

静的でなければならないクラスのグループに対して定義と実装の両方の共通セットを定義したいと思います。つまり、私は、それぞれがまったく同じ4人のメンバーを持っているいくつかの任意のベース・コンバータを作りたい:

// 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 = 16およびglyphs = { '0', '1', ... 'E', 'F' }を有する。私はFromIntToIntが自明であると信じています。明らかに私はベース16のコンバータを実装する必要はありませんが、私はを実行する必要がありますは、業界固有のベース36(0 - ZグリフCode 39)の1つを実装する必要があります。 [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) { } 
} 

これはコンパイラのために働かない理由を私は見ることができます - そこに静的メソッドにはvtableのはありませんし、すべてのこと。私は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)に関する素敵な記事があります。 –

答えて

1

答えはシングルトンパターンでした。例えば、Implementing Singleton in C#を参照してください。

Luiggi Mendozaがこの回答を提供しましたが、回答としてマークしましたが、何らかの理由で削除しました。私は完全さのためにそれを再ポストしています。

+0

ここで完全性を提供していただきありがとうございます。 – RvdV79

1

なぜ静的にしたいのですか?

Singletonあなたが探しているようです。

+1

_singletonデザインパターンは私が探していたパターンですが(Luiggiの言葉通り)、Wikipediaの曖昧さ回避ページへのリンクは、なぜこの用語が混乱しているのかを示しています。タプルとして4.0++ 。 MDSN自体には、[**シングルトンデザインパターン**](http://msdn.microsoft.com/en-us/library/ff650316.aspx)と[** Tuple クラス**]について記述されたドキュメントがあります( http://msdn.microsoft.com/en-us/library/dd386941.aspx)を「1タプル」または「**シングルトン**」としてください。" –

+0

私は私がより良くリンクしているものを見ておくべきです:) – penartur

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型のpublic staticプロパティがあります。

  • ASCII
    • ASCII(7ビット)文字セットのエンコーディングを取得します。
  • BigEndianUnicode
    • は、ビッグエンディアンバイト順を使用するUTF-16形式のエンコーディングを取得します。
    • デフォルトでは、オペレーティングシステムの現在のANSIコードページのエンコーディングを取得します。
  • ユニコード
    • リトルエンディアンバイト順を使用してUTF-16形式のエンコーディングを取得します。
  • UTF32
    • リトルエンディアンバイト順を使用してUTF32形式のエンコーディングを取得します。
  • UTF7
    • はUTF7形式のエンコーディングを取得します。
  • UTF8
    • は、UTF8形式のエンコーディングを取得します。あなたのケースでは

、あなたは抽象基底クラスではなく、インタフェースを提供し、静的プロパティとしてあなた一般的な実装を公開します。

開発者は、あなたが提供する一般的なコンバータの実装に簡単にアクセスできますし、独自のコンバータを実装することもできます。

+0

+1 - Luiggiは、明確な理論的説明へのリンクで直接答えを提供しましたが、これはBCLで​​使用されているパターンの素晴らしい例です。 –

+0

@jmh_gr:まあ、実際には同じではありませんが、あなたはアイディアを得ています。このような状況では、似たようなパターンのフレームワークを見るのは常に良いです。 BCLを使用する開発者 – Will