4

C# には、 classfooから継承するクラスbarがあり、これは class から継承されfoobarます。

コンストラクターでは、コンストラクターの呼び出しからではなくfoo、コンストラクターを直接呼び出したいと考えています。私はこのようなことを試しました:foobarbar

 public foo(int i): base : base(i)

明らかにこれは機能しません。barコンストラクターを経由せずに、どのように機能させますか?

4

4 に答える 4

13

bar の初期化をスキップできないため、できません。引数を渡すコンストラクターを bar に作成する必要があります。その理由は、基本クラスの構築方法を決定するのは bar の責任だからです。(基本クラスの構築は bar の実装の一部であり、オブジェクト指向の原則の 1 つはカプセル化 (実装を外部に隠すこと) です。)

于 2012-08-30T12:44:05.573 に答える
1

実行したい共有ロジックをfoobarコンストラクターから取り出します。

呼び出された初期化でメソッドを作成しますfoobar。署名は次のようになりますvoid initialize(int i)

のコンストラクタからこのメソッドを呼び出しfooます。

もちろん、これは のコンストラクターをスキップしませんbar

于 2012-08-30T12:45:11.843 に答える
0

+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)
    {

    }
}
于 2012-08-30T13:07:35.697 に答える
0

そのように機能するように設計されていない言語機能から特定の動作を取得しようとしていると思います。たとえば、例外を使用して通常のアプリケーションフローを制御するのと似ています。

おそらく、あなたは私たちにもっと詳細を教えて、あなたがやろうとしていることにもっと適切なアドバイスを得ることができます。

于 2012-08-30T12:46:47.617 に答える