当前位置: 首页 > 面试题库 >

匿名接口实现

楮星鹏
2023-03-14
问题内容

我已经阅读了“ C#匿名实现接口(或抽象类)
线程以匿名实现接口。但是我想知道使用委托或任何类似方法的.NET 2.0(NO LINQ)是否也可能实现 我从JAVA知道以下可能:

MyClass m = MyMethod(new MyInterface() {
    @override
    public void doSomething() {...}
}

(我希望我还记得,是一段时间以前我使用JAVA,但我想它是类似的东西)。每当方法需要接口的实例并且仅被调用一次时,这可能会有所帮助,因此无需为此单一方法创建新的类。


问题答案:

.NET 2.0还支持匿名委托,只是语法比lambda更加冗长,并且类型推断不起作用。而且,C#2.0中没有扩展方法(尽管您可以使用C#3.0并针对.NET
2.0进行编译),这是LINQ的基础,并且可以在接口上进行操作。

比较:

  • .NET 2.0: delegate(int i) { return (i < 5); }
  • .NET 3.5: i => i < 5

.NET 2.0还缺少通用的通用委托签名(FuncAction),但是您也可以轻松地自己定义它们(对于您喜欢的所有参数组合):

public delegate void Action<T>(T item);
public delegate Tresult Func<T, Tresult>(T item);

因此,无论您使用链接答案来模拟匿名接口的任何方法,都可以使用.NET 2.0委托来表示,但要以增加冗长为代价。让你问自己:“这写起来真的 那么 短吗?”

[更新]

如果您的接口是单个方法接口,例如:

interface IFoo
{
    string Bar(int value);
}

class SomeOtherClass
{
    void DoSomething(IFoo foo);
}

那么您可能会完全摆脱它,而只需使用委托即可:

class SomeOtherClass
{
    void DoSomething(Func<int, string> bar);
}

new SomeOtherClass().DoSomething(delegate(int i) { return i.ToString(); });

如果您有一个包含许多方法的接口,希望可以在许多不同的地方内联实现,则可以使用以下方法:

interface IFoo
{
    string GetSomething();
    void DoSomething(int value);
}

// conditional compile, only if .NET 2.0
#if NET_2_0
public delegate void Action<T>(T item);
public delegate Tresult Func<Tresult>();
#endif

class DelegatedFoo : IFoo
{
    private readonly Func<string> _get;
    private readonly Action<int> _do;

    public DelegatedFoo(Func<string> getStuff, Action<int> doStuff)
    {
        _get = getStuff;
        _do = doStuff;
    }

    #region IFoo members simply invoke private delegates

    public string GetSomething()
    { return _get(); }

    public void DoSomething(int value)
    { _do(value); }

    #endregion
}

这将使您可以将委托传递给DelegatedFoo内联类:

var delegated = new DelegatedFoo(
    delegate() { return ""; }, // string GetSomething()
    delegate(int i) { }        // void DoSomething(int)
);

使用 .NET 4 的C#4.0语法,由于lambda和命名参数在语法上的甜美,它看起来会更干净一些:

var delegated = new DelegatedFoo(
    getStuff: () => "",
    doStuff:  i => { }
);


 类似资料:
  • 问题内容: 在Java中,可以扩展带有匿名类的接口,该类可以动态实现。例: (更多信息:http : //www.techartifact.com/blogs/2009/08/anonymous-classes-in-java.html#ixzz1k07mVIeO) 这在C#中可能吗?如果不是,那么有什么可行的替代方法而不必依赖于实现过多的子类? 问题答案: 不,您不能在C#中做到这一点-但通常,

  • 问题内容: 我最近开始使用C#,并且我想找到与此等效的方法。我不知道这叫什么,所以我将简单地通过代码向您展示。 使用Java,我能够创建如下接口: 并像下面这样在方法的参数中传递此接口: 编辑 :我的问题是关于类中的方法的,如果使用C#可以执行这样的操作。 我想知道是否有一种方法可以使用C#(在方法中实例化接口)执行类似的操作,以及这实际上是什么。谢谢! 问题答案: 哇…好吧,请允许我概括一下:

  • 问题内容: 我有一个第三方Java库,该对象的接口如下: 我如何像Java匿名类一样在Kotlin中简洁地实现它: 问题答案: 假设接口只有一种方法,则可以使用SAM 如果您有一个接受处理程序的方法,那么您甚至可以忽略类型参数: 如果接口具有多个方法,则语法会更加冗长:

  • 假设我有注释类: 如何从它扩展接口?编译器在这方面失败: 游乐场链接:https://www.typescriptlang.org/play/#src=const匿名类=类{} let a: typeof匿名类; 接口I扩展类型的匿名类{

  • 本文向大家介绍Kotlin 匿名类实现接口和抽象类的区别详解,包括了Kotlin 匿名类实现接口和抽象类的区别详解的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,还是上代码吧 接口: 抽象类: 看到区别了吗?哈哈,看不到没关系,我告诉你。 他们之间唯一的区别就是调用时的下面这句,抽象类多了一个括号。 object : OnBind object : AbstractOnBind() 就

  • 使用(方法1)单独的侦听器类(可能是内部类)的好处/缺点是什么: 与(方法2)实现接口 与(方法3)相比,为每个需要侦听器的元素设置一个匿名类。 问:这些方法的优点和缺点是什么?是否有性能优势,或者任何推荐一个而不是另一个的设计模式?或者任何其他好处? 我可以看到: 第一种方法是清洁 注意:我看到一个关于嵌套类vs实现ActionListener的问题;但大多数答案似乎给出了患者使用的方法,而不是