覆盖在C#

问题描述:

在java中在实例创建抽象方法,我们可以覆盖或实现在实例创建抽象方法如下:覆盖在C#

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

    } 
    public void AbstractMethod2(string i) { 

    } 
}; 

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

感谢

这个Java功能称为"anonymous class",而不是“关于创建实例方法的重写”。在C#中没有相同的功能。

C#采取了不同的路线 - 而不是提供创建子类的方便语法,它扩大在其委托功能,提供anonymous delegateslambdas。 Lambdas让你插入一段代码。

不知道Java,但这个“闻起来”像Anonymous TypesC#

例如,你可以写这样的:

var myNewType = new { 
         Name = "Charles", 
         Surname="Dickens", 
         Age = 55 
         }; 
+1

不,与匿名类没有多少共同之处 - 即使它们听起来很相似。 – Voo

可以实现通过巧妙地利用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)); 

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

+0

这很好,但不是某个刚刚学习C#的人应该考虑的问题:) – TDaver

+0

@TDaver,lambda表达式已超过.net 4年的一部分,它们无处不在。作者熟悉Java,它有一个lambda表达式,所以它不是一个新概念,只是一个稍微不同的(更好的)语法。 –

+0

虽然我同意你lambda表达良好,应该使用(特别是与LINQ),但初学者很难真正掌握基类的类设计考虑,如你建议的:) – TDaver