2

流暢なインターフェイスを備えた静的クラスを作成したいのですが、次のエラーが発生します。

'this' は、静的プロパティ、メソッドでは無効です ...

これが私のコードです:

public static MyClass
{
    private static StringBuilder builder;
    private static StringBuilder RouteBuilder
    {
        get
        {
            if (builder == null)
                builder = new StringBuilder();

            return builder;
        }
    }

    public static MyClass Root()
    {
      RouteBuilder.Append("/");
      return this;
    }

    public static MyClass And()
    {
      RouteBuilder.Append("and");
      return this;
    }

    public static MyClass Something()
    {
       RouteBuilder.Append("something");
       return this;
    }
}

これにより、私はすることができますMyClass.Root().And().Something();

これを行う方法または回避策はありますか?

4

4 に答える 4

12

それは可能ではありません。静的クラスのインスタンスを持つことはできません。MyClass を static としてマークしたため、インスタンスは存在できません。静的にしないでください:

public class MyClass
{
    private StringBuilder builder;
    private StringBuilder RouteBuilder
    {
        get
        {
            if (builder == null)
                builder = new StringBuilder();

            return builder;
        }
    }

    public MyClass Root()
    {
        RouteBuilder.Append("/");
        return this;
    }

    public MyClass And()
    {
        RouteBuilder.Append("and");
        return this;
    }

    public MyClass Something()
    {
        RouteBuilder.Append("something");
        return this;
    }
}

そして、チェーンすることができます:

var result = new MyClass().Root().And().Something();
于 2012-04-15T08:52:30.780 に答える
1

return RouteBuilder がうまくいきます!

編集:間違っています、ごめんなさい

これらの場合、拡張クラスを実行することもできます

言う

 public static class StringBuilderExtensions {

    public static StringBuilder Root(this StringBuilder builder) {
      Asserts.IsNotNull(builder);
     builder.Append("/");
     return builder;
    }

   public static StringBuilder And(this StringBuilder builder) {
     Asserts.IsNotNull(builder);
     builder.Append("and");
     return builder;
   }
   //...etc
 }

そしてそれを次のように使用します

var builder = new StringBuilder();
builder.Root().Append()
于 2012-04-15T08:53:07.980 に答える
0

言語がこれを許可していることに驚いています-定義したメソッドは明らかにインスタンスを返しますが、まったく同じクラス定義で、そのインスタンスを作成できないと宣言しました。

通常のクラスで静的メソッドを定義することもできます。次の方法で、実装者に常に流暢なインターフェースを使用させ、MyClass自分自身をインスタンス化しないように強制できます。

  • private MyClass()内部からのみ呼び出すことができるプライベート コンストラクターを MyClass に与えるMyClass
  • sealedパブリック コンストラクターを公開する継承者の作成を防止するようにMyClass をマークします。
于 2012-04-15T08:58:21.003 に答える
0

'this' はクラスの CURRENT INSTANCE を返すため、静的メソッドで 'this' キーワードを使用することはできません。ただし、静的メソッドはどのインスタンスにも属していない (代わりに、クラス自体に属している) ため、それを返すことはできません。

クラスとメソッドを静的にする必要があるのはなぜですか? すべての静的キーワードを削除すると機能します。場合は、代わりにシングルトン パターンを使用してください。

于 2012-04-15T09:02:34.603 に答える