0

我想编写一段代码来存储类引用并能够在其中调用特定的函数。这意味着我可以换掉这个类来实现不同的功能。例如,我可以拥有一个类实例

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

换句话说,我可以初始化一个计算 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 回答