なぜプライベートコンストラクタが必要なのか?
2023-11-11 19:54:53
疑問点
クラスがプライベートコンストラクタを持つ場合、そのクラスはインスタンス化されることはありません。 ですから、もし私のクラスがインスタンス化されずに使用されることを望むのであれば、それを静的にすることができます。
プライベートコンストラクタの使い道は?
また、シングルトン・クラスで使用されていますが、それ以外に使い道はありますか?
(注)上記シングルトンの場合を除いているのは、静的なクラスがあるのに、なぜシングルトンが全く必要ないのかが理解できないからです。私が質問で混乱するために、これに答えないかもしれません。)
どのように解決するのですか?
工場
プライベートコンストラクタは、ファクトリーパターン(言い換えれば、明示的なインスタンス生成ではなく、クラスのインスタンスを取得するために使用する静的関数)を使用する場合に便利な場合があります。
public class MyClass
{
private static Dictionary<object, MyClass> cache =
new Dictionary<object, MyClass>();
private MyClass() { }
public static MyClass GetInstance(object data)
{
MyClass output;
if(!cache.TryGetValue(data, out output))
cache.Add(data, output = new MyClass());
return output;
}
}
ネストされた子供による擬似シール
外側のクラスを継承するネストしたクラスは、プライベートコンストラクタにアクセスすることができます。
例えば、これを利用して、抽象クラスで
あなたは
は継承できるが、他の誰も継承できない抽象クラス(
internal
コンストラクタもまた、単一のアセンブリに継承を制限するためにここで動作します。
private
コンストラクタはすべての実装をネストされたクラスにすることを強制します)。
public abstract class BaseClass
{
private BaseClass() { }
public class SubClass1 : BaseClass
{
public SubClass1() : base() { }
}
public class SubClass2 : BaseClass
{
public SubClass2() : base() { }
}
}
ベースコンストラクタ
これらは、よりアクセスしやすい別のコンストラクタから呼び出される "ベース" コンストラクタを作成するために使用することも可能です。
public class MyClass
{
private MyClass(object data1, string data2) { }
public MyClass(object data1) : this(data1, null) { }
public MyClass(string data2) : this(null, data2) { }
public MyClass() : this(null, null) { }
}
関連
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] C#でHashtableよりDictionaryが好まれる理由とは?
-
[解決済み] \0-9]よりも効率が悪い
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み] Entity Framework 5 レコードを更新する
-
[解決済み】大文字・小文字を区別しない「Contains(string)
-
[解決済み] XMLシリアライズ可能なクラスがパラメータなしのコンストラクタを必要とする理由
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である