java - 匿名接口(interface)实现

标签 java c# .net-2.0 anonymous-class

我读过'C# anonymously implement interface (or abstract class) ' 用于匿名实现接口(interface)的线程。但我想知道使用 .NET 2.0(无 LINQ)使用委托(delegate)或任何类似的方法是否也可以实现这一点。我从JAVA知道以下可能:

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

(希望我没记错,以前我用过JAVA,但我想应该是类似的东西)。每当方法需要接口(interface)的实例并且仅调用一次时,这可能会很有帮助,因此无需为此单一方法创建新类。

最佳答案

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

比较:

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

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

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

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

[更新]

如果您的接口(interface)是单一方法接口(interface),例如:

interface IFoo
{
    string Bar(int value);
}

class SomeOtherClass
{
    void DoSomething(IFoo foo);
}

那么你可能会完全摆脱它并简单地使用委托(delegate):

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

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

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

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 - 匿名接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24931211/

相关文章:

java - 在使用请求调度程序转发的 servlet 内使用 sendRedirect

java - 如何将字节数组存储为磁盘上的图像文件?

C#,将 Action 分配给委托(delegate)

c# - UAC 需要控制台应用程序

c# - 将系统从 .Net 2 升级到 .Net 3.5 或 4 对客户有什么好处

java - Java通过参数获取类型

java - 一个 native 方法可以从另一个 native 方法调用吗?

c# - 泛型和 "One of the parameters of a binary operator must be the containing type"错误

c# - 如何从 windows 服务使用 windows 身份验证连接到 sql-server?

c# - .NET 2.0 中的等效任务