C# クラスの代わりのパラメーターなしのコンストラクターを定義することは可能ですか?
つまり、クラスがありFoo
ます。デフォルトのコンストラクターFoo()
と別のコンストラクターが必要SpecialFoo()
です。SpecialFoo()
コンストラクターがコンストラクターを呼び出してもかまいませんFoo()
。
それをしてもいいですか?
C# クラスの代わりのパラメーターなしのコンストラクターを定義することは可能ですか?
つまり、クラスがありFoo
ます。デフォルトのコンストラクターFoo()
と別のコンストラクターが必要SpecialFoo()
です。SpecialFoo()
コンストラクターがコンストラクターを呼び出してもかまいませんFoo()
。
それをしてもいいですか?
指定された一連のパラメーターを持つコンストラクターは 1 つしか持てないため、パラメーターのないコンストラクターを 2 つ持つことはできません。
ファクトリメソッドになり、クラスの新しいインスタンスを返す別のpublic static Foo SpecialFoo
メソッドを持つことができますが、それを使用するにはキーワードを使用しません:Foo
new
class Foo
{
public static Foo SpecialFoo()
{
return new Foo();
}
}
var instance1 = new Foo();
var instance2 = Foo.SpecialFoo();
コンストラクターは、メソッドと同様に、同一のパラメーター リストを持つオーバーロードを持つことはできません。ただし、次のように静的ファクトリ メソッドを作成できます。
public class Foo
{
public static Foo SpecialFoo() {
...
}
}
そして、次のように呼び出します。
var foo = new Foo();
var specialFoo = Foo.SpecialFoo();
別の方法は、次のように別のコンストラクターを使用することです。
public class Foo
{
public Foo(bool special) : this() {
if (special)
{
...
}
}
}
そして、次のように呼び出します。
var foo = new Foo();
var specialFoo = new Foo(true);
もちろん、これは実際には「代替のパラメーターなしのコンストラクター」としての資格はありませんが、静的ファクトリよりもいくつかの利点があります。主に、継承されたクラスで使用および拡張できますが、これはファクトリ メソッドでは許可されていません*。
* 実際には可能ですが、基本ファクトリ メソッドを で非表示にする必要があります。そうしないnew
と、警告が表示されます。また、基本クラスの静的メンバーを非表示にすることは一般的に悪い習慣です。