可以使用lambda函数覆盖方法

时间:2009-07-09 00:53:56

标签: c# lambda

有没有办法用lambda函数覆盖类方法?

例如,

的类定义
class MyClass {  
    public virtual void MyMethod(int x) {
        throw new NotImplementedException();
    }
}

无论如何都要这样做:

MyClass myObj = new MyClass();
myObj.MyMethod = (x) => { Console.WriteLine(x); };

6 个答案:

答案 0 :(得分:6)

Chris是对的,方法不能像变量一样使用。但是,您可以这样做:

class MyClass {
    public Action<int> MyAction = x => { throw new NotImplementedException() };
}

允许覆盖操作:

MyClass myObj = new MyClass();
myObj.MyAction = (x) => { Console.WriteLine(x); };

答案 1 :(得分:5)

没有。但是,如果您首先将该方法声明为lambda,则可以设置它,但我会尝试在初始化时执行此操作。

class MyClass {  
    public MyClass(Action<int> myMethod)
    {
        this.MyMethod = myMethod ?? x => { };
    }

    public readonly Action<int> MyMethod;
}

但是,除非接口指定了lambda属性,否则无法实现声明了MyMethod的接口。

F#有对象表达式,允许你用lambdas组成一个对象。我希望在某些时候这是c#的一部分。

答案 2 :(得分:0)

没有。方法不能像变量一样使用。

如果您使用的是JavaScript,那么您可以这样做。

答案 3 :(得分:0)

您可以编写此代码:

MyClass myObj = new MyClass();
myObj.TheAction = x => Console.WriteLine(x);
myObj.DoAction(3);

如果以这种方式定义MyClass:

class MyClass
{
  public Action<int> TheAction {get;set;}

  public void DoAction(int x)
  {
    if (TheAction != null)
    {
      TheAction(x);
    }
  }
}

但这不应该太令人惊讶。

答案 4 :(得分:0)

不是直接的,但只需要一些代码即可。

public class MyBase
{
    public virtual int Convert(string s)
    {
        return System.Convert.ToInt32(s);
    }
}

public class Derived : MyBase
{
    public Func<string, int> ConvertFunc { get; set; }

    public override int Convert(string s)
    {
        if (ConvertFunc != null)
            return ConvertFunc(s);

        return base.Convert(s);
    }
}

然后你可以有代码

Derived d = new Derived();
int resultBase = d.Convert("1234");
d.ConvertFunc = (o) => { return -1 * Convert.ToInt32(o); };
int resultCustom = d.Convert("1234");

答案 5 :(得分:0)

根据您的目的,有很多方法可以解决这个问题。

一个好的起点是创建一个gettable和settable的委托(例如Action)属性。然后,您可以拥有一个委托给该action属性的方法,或者直接在客户端代码中调用它。这会打开很多其他选项,例如将action属性设置为私有可设置(可能提供构造函数来设置它)等。

E.g。

class Program
{
    static void Main(string[] args)
    {
        Foo myfoo = new Foo();
        myfoo.MethodCall();

        myfoo.DelegateAction = () => Console.WriteLine("Do something.");
        myfoo.MethodCall();
        myfoo.DelegateAction();
    }
}

public class Foo
{
    public void MethodCall()
    {
        if (this.DelegateAction != null)
        {
            this.DelegateAction();
        }
    }

    public Action DelegateAction { get; set; }
}