C# には、 classfoo
から継承するクラスbar
があり、これは class から継承されfoobar
ます。
コンストラクターでは、コンストラクターの呼び出しからではなくfoo
、コンストラクターを直接呼び出したいと考えています。私はこのようなことを試しました:foobar
bar
public foo(int i): base : base(i)
明らかにこれは機能しません。bar
コンストラクターを経由せずに、どのように機能させますか?
C# には、 classfoo
から継承するクラスbar
があり、これは class から継承されfoobar
ます。
コンストラクターでは、コンストラクターの呼び出しからではなくfoo
、コンストラクターを直接呼び出したいと考えています。私はこのようなことを試しました:foobar
bar
public foo(int i): base : base(i)
明らかにこれは機能しません。bar
コンストラクターを経由せずに、どのように機能させますか?
bar の初期化をスキップできないため、できません。引数を渡すコンストラクターを bar に作成する必要があります。その理由は、基本クラスの構築方法を決定するのは bar の責任だからです。(基本クラスの構築は bar の実装の一部であり、オブジェクト指向の原則の 1 つはカプセル化 (実装を外部に隠すこと) です。)
実行したい共有ロジックをfoobar
コンストラクターから取り出します。
呼び出された初期化でメソッドを作成しますfoobar
。署名は次のようになりますvoid initialize(int i)
のコンストラクタからこのメソッドを呼び出しfoo
ます。
もちろん、これは のコンストラクターをスキップしませんbar
。
+1どのように構築したいかを決定するのはバーの責任であることに同意します。以下のようなコードを作成したので、デフォルトのコンストラクター(バー)を使用してコンストラクターをオーバーライドできます
public class bar
{
// Original constructor
int value { get; set; }
public bar(int i)
{
this.value = i;
}
}
public abstract class foobar : bar
{
int value {get; set;}
protected foobar(int i) : base(i)
{
value = i;
}
}
public class foo : foobar
{
// New constructor
protected foo(int i)
: base(i)
{
}
}
そのように機能するように設計されていない言語機能から特定の動作を取得しようとしていると思います。たとえば、例外を使用して通常のアプリケーションフローを制御するのと似ています。
おそらく、あなたは私たちにもっと詳細を教えて、あなたがやろうとしていることにもっと適切なアドバイスを得ることができます。