我已经阅读了“ 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的基础,并且可以在接口上进行操作。
比较:
delegate(int i) { return (i < 5); }
i => i < 5
.NET 2.0还缺少通用的通用委托签名(Func
和Action
),但是您也可以轻松地自己定义它们(对于您喜欢的所有参数组合):
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的问题;但大多数答案似乎给出了患者使用的方法,而不是