我读过'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)签名( Func
和 Action
),但您也可以轻松地自己定义它们(对于您喜欢的所有参数组合):
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/