C#中替代内联接口实现的方案

9
我希望在C#中使用内联接口实现,但是通过阅读这篇文章或这篇文章等我发现它不像Java那样做。
假设有这个接口:
public interface MyListener {
    void onHandleOne();
    void onHandleTwo();
    }

我将此接口作为参数传递:

   myMethod(MyListener listener){
    //some logic
   }

当我调用它时,我希望像在Java中一样进行内联实现:

myMethod(new MyListener () {
                    @Override
                    public void onHandleOne() {
                        //do work
                    }

                    @Override
                    public void onHandleTwo() {
                        //do work
                    }
                });

作为替代方案,我创建了一个实现了该接口的类,并使用该类来调用我的方法:
public class MyImplementor : MyListener  {
    public void onHandleOne() {
        //do work
        }

    public void onHandleTwo() {
        //do work
        }
    }

并且调用我的方法:myMethod(new MyImplementor()) 但是这种解决方案每次调用该方法都需要一个新的类(用于不同的行为),也许有一种使用lambda或某种方式来实现它的方法:

myMethod(new MyImplementor() =>{//处理我的方法})


你想要不同的 onHandleOneonHandleTwo 实现,是吗? - Valentin
MyImplementor 类在构造函数中接受 Action 实例并将它们存储在私有字段中。然后在方法中调用这些操作。 - Yacoub Massad
在 .net 中,标准模式是使用事件。Java 不使用这个模式,因为 Java 没有委托和事件,而事件比监听器更灵活。 - Gusman
1个回答

10

但是这种解决方案每次调用此方法(以获得不同的行为)都需要一个新类,也许可以使用lambda或其他方式进行处理

是的,给它一个委托参数并传递一个lambda表达式。

public class MyImplementor : MyListener  
{
    private readonly Action handle1;
    private readonly Action handle2;
    public MyImplementor(Action handle1, Action handle2)
    {
        this.handle1 = handle1;
        this.handle2 = handle2;
    }

    public void onHandleOne() 
    {
       handle1();
    }

    public void onHandleTwo()
    {
       handle2();
    }
}

然后您可以将其用作

myMethod(new MyImplementor(()=>{//handle method1}, ()=>{//Handle method2}); 

1
不好,通常会给出签名(第三方),而且它需要一个接口。所以我不能将其更改为委托。 - Zoli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接