2
public abstract class Request
{
   public class Parameters
   {
       //Threre are no members here
       //But there should be in inherited classes
   }

   public Request()
   {
       parameters = new Parameters();
   }

   public Parameters parameters;
}

2つの質問:

  1. コンストラクターに何かを追加できるようにするにはどうすればよいですか?元のコンストラクターは引き続き実行されますか?

  2. サブクラスがParametersクラスにメンバーを追加できるようにするにはどうすればよいですか?

4

3 に答える 3

7

私が思うことをしているのなら、コンストラクターを少し変更する必要があります。

public Request(Parameters parameters) {
  this.Parameters = parameters;
}

そして、あなたはこれを行うことができます:

public class SpecificRequest : Request {
  public class SpecificRequestParameters : Request.Parameters {
  }
  public SpecificRequest() : base(new SpecificRequestParameters()) {
    //More stuff here
  }
}

あなたが取り組もうとしている特定の問題は何ですか?ここで行っていることは、かなり厄介で非常に複雑に思えます。

于 2010-04-11T20:21:28.820 に答える
1

なぜRequestクラス内にParametersクラスを埋め込むのですか?代わりに、Requestにパラメーターのインスタンスを持たせ、クラスを別の場所で宣言します。

質問への回答1:リクエストから継承すると元のリクエストコンストラクターが常に呼び出されます。

質問2:サブクラスはパラメータークラスにメンバーを追加できません(リフレクションを除くが、そのパスを歩きたくない)。できる最善の方法は、パラメーターから継承し、AttachedRequestに考慮するべきParameterクラスを使用させることです。その場合、プロパティとプロパティを上書きできないことに注意してください。AttachedRequestには、DependedParametersタイプのAdditionalParametersという追加のプロパティが必要です。

于 2010-04-11T20:23:28.203 に答える
1

コンストラクターは構文で連鎖させることができます

ctor() : this()

また

ctor() : base()

そこでは、パラメータなどを渡すことができます。

パラメータフィールドを汎用にする

abstract class Request<T> where T : Parameters {
  T Parameters;
}

class Specialized : Request<SpecialParameters> {
}

ここで、SpecialParametersから継承しParametersます。

于 2010-04-11T20:28:23.973 に答える