2009-08-17 9 views
1
public class BaseFoo 
{ 
    private string param; 

    public BaseFoo(string param) 
    { 
     this.param = param; 
    } 
} 

public sealed class SingletonFoo : BaseFoo 
{ 
    static readonly SingletonFoo instance = new SingletonFoo(); 

    static SingletonFoo() 
    { 
    } 

    public static SingletonFoo Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
} 

この種の継承は可能ですか?基本クラスにはパラメータを持つコンストラクタが必要ですか? (パラメータが基本クラスに渡されないため、上記のコードは明らかにコンパイルされません)。コンストラクタでパラメータをとる基本クラスの継承シングルトンクラスですか?

はいの場合、どのように達成されますか?私は非シングルトン基本クラスから派生する「シングルトン」は完全にしばしば不適切に使用されるパターンの全体概念を無効にかなり確信している

public SingletonFoo (string param) : base(param) 
{ 
} 

答えて

2

public sealed class SingletonFoo : BaseFoo 
{ 
    static readonly SingletonFoo instance = new SingletonFoo("Some Value"); 

    static SingletonFoo() 
    { 
    } 

    private SingletonFoo(string value) : base(value) 
    { 
    } 
    // ... 

これはインラインコンストラクタにパラメータを宣言してみましょう、とチェーンをそれを呼び出します。

1

で開始する。

静的コンストラクタはパラメータをとらないので、それらを基本クラスに渡す唯一の方法はコンストラクタチェーンを経由することですが、静的コンストラクタからインスタンスコンストラクタを呼び出すことはできません。

ここでは正確に何をしようとしていますか?あなたは、インスタンスコンストラクタを作成し、それを参照する必要が

+0

ああ、静的なSingletonFoo()はそれをやり遂げていませんでした。明示的な静的コンストラクタの目的は、beforefieldinitのように型をマークしないようコンパイラに指示することです。これによりこの仕組みが変更されますか? –

+0

まあ、私はかなり特定のシングルトンはとにかく封印されるべきだと確信しています。しかし、[私はテストしていません]、あなたはそのコンストラクタにも '基本'ステートメントを置くことができるはずです。しかし、間違っている可能性があります。 –

+0

@ジョン:これは正しいアプローチですが、質問の一部にしか答えません。静的コンストラクタではなくインスタンスコンストラクタに配置し、インラインで呼び出す必要があります。私はプロセス全体を実証する答えを出しました。 –

1

:あなたは「ベース」キーワードを使用

+1

.NETでは、技術的にすべてのシングルトンは非シングルトンの基本クラス(System.Object)を継承します。非シングルトン型から継承することに根本的に間違ったものは何もありません。 –

+0

私はそれを知っていますが、ありがとうございます。静的でないクラスから派生したシングルトンクラスをなぜ必要としているのか、おそらくグローバル変数か通常の静的なものが適切ではないのかどうか、ちょっと混乱して懐疑的です。 – jscharf

関連する問題