5

在java中,我们可以在实例创建时重写或实现抽象方法,如下所示:

AbstractClass test =new AbstractClass() 
{
    public void AbstractMethod(string i) {

    }
    public void AbstractMethod2(string i) {

    }
};

这在 C# 中可能吗?如果是,等效代码是什么

谢谢

4

3 回答 3

8

此 Java 功能称为“匿名类”,而不是“实例创建方法的覆盖”。C# 中没有相同的功能。

C# 采取了不同的路线——它没有为创建子类提供方便的语法,而是扩展了它的委托特性,提供了匿名委托lambdas。Lambda 让您可以插入代码片段。

于 2012-05-27T20:19:24.400 回答
2

您可以通过巧妙地使用 lambda 来实现非常相似的效果:

public class BaseClass {

    public BaseClass(Action<string> abs1 = null, Action<string> abs2 = null){
       AbstractMethod1 = abs1 ?? s=>{};
       AbstractMethod2 = abs2 ?? s=>{};
    }

    public Action<string> AbstractMethod1 {get; private set;}
    public Action<string> AbstractMethod2 {get; private set;}
}

所以你可以像这样使用这个定义:

new BaseClass( s=> Console.WriteLine(s), s=> Console.WriteLine(s));

您还可以将所有方法定义为接口的一部分,然后使用接口的具体实现构造一个类(代理对具体实现的调用)——我称之为“策略”模式。但这只是这个主题的一个变体。

于 2012-05-27T20:32:30.227 回答
0

不知道Java,但这“闻起来”像匿名类型C#

例如,您可以编写如下内容:

 var myNewType = new { 
                       Name = "Charles", 
                       Surname="Dickens", 
                       Age = 55 
                      };
于 2012-05-27T20:27:05.187 回答