0

クラス参照を格納し、その内部で特定の関数を呼び出すことができるコードを作成したいと考えています。これは、クラスを交換して別の機能を実現できることを意味します。たとえば、クラスインスタンスを保持できます

     classDelegate cl = new ofSomeClass();
     cl.executeFunction("functionName");

つまり、1+1 を計算する 1 つのクラスを初期化し、次に 2+2 を計算する別のクラスを初期化できます。このようにして、cl を初期化するために別のクラスを渡すだけで、計算を動的に入れ替えることができます。

これは説明するのが面倒です...うまくいけば、私はある程度の意味を持っています...これはまったく可能ですか?

4

2 に答える 2

1

あなたが投稿した質問はやや漠然としていますが、インターフェイスを定義してから、異なるクラスのそれぞれにそのインターフェイスを実装させる必要があるようです。「計算」メソッドを参照している例では、次のようなインターフェイスを定義するだけです。

public interface ICalculator
{
    int NumberOne
    {
        get;
        set;
    }

    int NumberTwo
    {
        get;
        set;
    }

    int Calculate ( );
}

次に、さまざまなクラスを作成すると、次のようなインターフェイスが実装されます。

public class TwoPlusTwoCalculator : ICalculator
{
    private int _numberOne;

    private int _numberTwo;

    public int NumberOne
    {
        get
        {
            return this._numberOne;
        }
        set
        {
            this._numberOne = value;
        }
    }

    public int NumberTwo
    {
        get
        {
            return this._numberTwo;
        }
        set
        {
            this._numberTwo = value;
        }
    }

    public TwoPlusTwoCalculator ( )
    { }

    public TwoPlusTwoCalculator ( int numOne, int numTwo )
    {
        this.NumberOne = numOne;
        this.NumberTwo = numTwo;
    }

    public int Calculate ( )
    {
        return this.NumberOne + this.NumberTwo;
    }
}

その後、コード内で Calculate メソッドを呼び出したい場合は、TwoPlusTwoCalculator、OnePlusOneCalculator、またはそのインターフェイスとしてインターフェイスを実装するその他のクラスのインスタンスをキャストできます。

public void GetValue ( int numOne, int numTwo ) { TwoPlusTwoCalculator 計算機 = new TwoPlusTwoCalculator ( numOne, numTwo ); PerformCalculation ( ICalculator としての電卓); }

    public int PerformCalculation ( ICalculator calculator )
    {
        return calculator.Calculate ( );
    }

それはあなたが達成しようとしていることですか?

于 2012-07-08T02:28:14.337 に答える
0

可能性があります...また、あなたが何をしたいのかはっきりしていません:

メソッドを名前で呼び出そうとしている場合 - リフレクションを使用 -GetMethod(string)そしてInvoke

インターフェイスを実装する複数のクラスを持つこともできます。

  interface MyFunctions{
     void ExecuteFunction(string name);
  }

または、共通の基本クラスを持つ派生クラスを使用します (インターフェースと同様):

public abstract class MyFunctionBase {
   abstract void ExecuteFunction(string name);
}

または単にActionクラスを使用します:

 Action myFunc = ()=> 1+1;
 myFunc();
于 2012-07-08T02:22:11.700 に答える