我知道它可以用Java完成,因为我过去曾广泛使用过这种技术.Java中的一个例子如下所示.(附加问题.这种技术被称为什么?如果没有名称,很难找到这样的例子.)
public abstract class Example { public abstract void doStuff(); } public class StartHere{ public static void main(string[] args){ Example x = new Example(){ public void doStuff(){ System.out.println("Did stuff"); } }; x.doStuff(); } }
现在,我的主要问题是,这也可以在C#中完成,如果是这样,怎么样?
Java技术被称为" 匿名内部类 ",在C#中没有等价物.
使用lamba表达式和类初始值设定项,您可以通过一些努力获得相同的行为.
public class Example { public Action DoStuff; public ActionDoStuffWithParameter; public Func DoStuffWithReturnValue; } class Program { static void Main(string[] args) { var x = new Example() { DoStuff = () => { Console.WriteLine("Did Stuff"); }, DoStuffWithParameter = (p) => { Console.WriteLine("Did Stuff with parameter " + p); }, DoStuffWithReturnValue = () => { return 99; } }; x.DoStuff(); x.DoStuffWithParameter(10); int value = x.DoStuffWithReturnValue(); Console.WriteLine("Return value " + value); Console.ReadLine(); } }
我刚刚意识到这个解决方案的一个问题是如果你要在Example类中创建字段,lambda表达式将无法访问这些字段.
但是,没有理由不能将示例实例传递给lambda表达式,这将使它们可以访问示例可能包含的任何公共状态.AFAIK在功能上等同于Java匿名内部类.
PS如果你要投票给答案,请帮我们一个忙,并添加评论,说明你不同意的原因:-)
通常,使用.Net中的委托以更清晰的方式解决使用Java中的匿名内部类解决的问题.您的示例有点过于简单,无法确定您的意图.如果你使用抽象类的意图是传递一个"行为",那就考虑只使用一个Action
委托.
public class StartHere{ public static void main(string[] args){ Action doStuff = () => Console.WriteLine("Did stuff"); executeSomething(doStuff); } public static void executeSomething(Action action) { action(); } }
这不能在C#中完成; 你需要声明一个新的类类型.你在C#中最接近的可能是一个命名的嵌套类:
public class StartHere{ private class Foo : Example { public override void doStuff() { Console.WriteLine("did stuff"); } } public static void Main(string[] args){ Example x = new Foo(); x.doStuff(); } }