有没有办法用lambda函数覆盖类方法?
例如,
的类定义class MyClass {
public virtual void MyMethod(int x) {
throw new NotImplementedException();
}
}
无论如何都要这样做:
MyClass myObj = new MyClass();
myObj.MyMethod = (x) => { Console.WriteLine(x); };
答案 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; }
}