2

変更できないパブリック メソッド (静的ではない) を持つクラスがある場合。
そして、既存の public 非静的メソッドを使用する独自のメソッドをいくつか追加する必要があります。

どうすれば正しい方法でそれを行うことができますか?

現在、自分のメソッドで自分のクラスのインスタンスを作成して他のメソッドを使用していますが、これは良い方法ではないと思います。

例:

class aaa
{

  public string a(int i)
  {
    ...
  }
  public string b (int i)
  {
    ...
  }

  public static void x()
  {
    aaa myclass = new aaa();
    string str = myclass.a(5);
  }

}
4

8 に答える 8

3

あなたのデザインは完全に正しいとは思いませんが、デザインを変更できない場合は、これでうまくいくかもしれません。この働き方は正しいやり方ではないとも思いますが。

public class MyClass
{
    public string MethodA(int i)
    {
        return StaticMethodA(i);
    }

    private static string StaticMethodA(int i)
    {
        return String.Format("i is {0}", i);
    }

    public static void MethodX()
    {
        string str = StaticMethodA(5);
    }
}

これで、次のことができるようになります。

MyClass mc = new MyClass();
string str = mc.MethodA(3);

//or

MyClass.MethodX();
于 2013-06-20T14:32:00.877 に答える
2

あなたが説明していることは、C# の拡張メソッドに非常によく似ています。staticそれらを別のクラスで定義し、インスタンス メソッドのように使用します。

于 2013-06-20T14:18:12.763 に答える
1

インスタンスメソッドが静的であることを本当に望んでいるようです。オブジェクトの内部状態の使用に依存しないため、最初から静的である必要があります(新しいメソッドがそのタイプのインスタンスを与えられたり、与えたり、再利用したりしていないため)。非静的コンテキストで使用する依存関係が多すぎるため、破壊的変更を加えて静的にすることはできません。

論理的には静的であってもメソッドを静的に変更できない場合、その解決策は実際にその状況でできる最善の方法です。基本的に、非静的メソッドに静的な「ウィンドウ」を作成しています。

于 2013-06-20T14:21:47.780 に答える
0

拡張メソッドの正確なユースケース imho。

閉じたクラスの権利に動作 (新しいメソッド) を追加する必要があります。だからただ行く:

class aaa
{
  public string a(int i)
  {
    ...
  }
  public string b (int i)
  {
    ...
  }
}

static class ExtensionContainer
{
  public static void x(this aaa myclass)
  {
    string str = myclass.a(5);
  }
}

拡張メソッドはインスタンス メソッドと同じように呼び出すことができるため、呼び出し元は、使用する必要がある関数に必要なオブジェクトを提供します。

実際に新しいメソッドを静的にする必要がある場合は、それは単なるコードの匂いです。純粋な関数に近い静的メソッド - 実装に内部ステートフル オブジェクトを使用していますか?

それが悪い設計の兆候ではない場合、状況がわかりません。クラスのシングルトン(aaa)を作成し、そのオブジェクトを使用してメソッドを実装します。

于 2013-06-20T15:02:35.733 に答える
0

ここで継承が役に立ちます。C# での構文は次のとおりです。

public class myClass : aaa
{

あとは、このクラスにメソッドを配置するだけです。他の方法も同様に機能します。

于 2013-06-20T14:20:40.847 に答える
0

クラスを変更できない場合は、拡張メソッドを使用します。 リンク

于 2013-06-20T14:21:38.937 に答える
0

非静的メソッドを呼び出すには、呼び出すインスタンス メソッドであるクラスのインスタンスが必要です。したがって、 class を変更することはできません。その場合、拡張メソッドで拡張するか、そのクラスから継承するaaaことしかできません。拡張メソッドのサンプルは次のとおりです。

public static class MyExtensions
{
    public static void x(this aaa myClass)
    {
       // use public methods of class you are extending
       string str = myclass.a(5);
    }
}

インスタンスxの通常のメソッドのようにメソッドを実行できます。myClass

aaa myclass = new aaa();
myClass.x(); // you extension 

ところで、C# では、クラスとメソッドに PascalNames を使用します。

于 2013-06-20T14:18:00.630 に答える