在C#中是否有创建匿名子类的语法?

在C#中是否有创建匿名子类的语法?,c#,.net,abstract-class,instance,C#,.net,Abstract Class,Instance,我可以像在Java中一样在C#/.net中创建抽象类的实例吗 附加信息 我想我们很多人都不明白我的意思是什么? 因此,在java中,I可以创建如下抽象类: 简单抽象类: /** * @author jitm * @version 0.1 */ public abstract class TestAbstract { public abstract void toDoSmth(); } 创建抽象类实例的代码 /** * @author jitm * @version 0.1

我可以像在Java中一样在C#/.net中创建抽象类的实例吗

附加信息

我想我们很多人都不明白我的意思是什么? 因此,在java中,I可以创建如下抽象类:

简单抽象类:

/**
 * @author jitm
 * @version 0.1
 */
public abstract class TestAbstract
{
    public abstract void toDoSmth();
}
创建抽象类实例的代码

/**
 * @author jitm
 * @version 0.1
 */
public class Main {
    public static void main(String[] args) {
        TestAbstract testAbstract = new TestAbstract() {
            @Override
            public void toDoSmth() {
                System.out.println("Call method toDoSmth");
            }
        };
    }
}

我能用c#做类似的事情吗?

不,不能直接做。您可以到达的最近距离(假设您具有以下类结构):

是:

C#与Java相同,在这种情况下,您不能实例化抽象类。

无论是在Java还是在C#中,您都不能创建抽象类的实例。 您将始终需要创建从抽象类继承的具体类。 Java允许您使用匿名类,而无需命名类。C#没有给你这个选择

(编辑以显示代理作为替换。我在这里没有访问VS的权限,因此它可能无法编译,但这是我的想法)

通常在Java中,当您使用带有单个抽象方法(SAM)的抽象类时,您真正想要实现的是将一些代码作为参数传递。 假设您需要使用Collections.sort(Collection,Comparator)根据类名对对象数组进行排序 (我知道Comparator是一个接口,但想法是一样的) 使用匿名类来避免额外的键入,您可以编写如下内容

   Comparator<Object> comparator = new Comparator<Object>{
        @Override
        public int compare(Object o1, Objecto2) {
            return o1.getClass().getSimpleName().compareTo(o2.getClass().getSimpleName()));
        }//I'm not checking for null for simplicity
   } 
   Collections.sort(list, comparator)

无论如何,如果您要将代码从java迁移到c#,您应该了解委托……在许多情况下,您将使用委托而不是匿名类。在本例中,您使用的是void toDoSmth()方法。有一个名为Action的委托,它几乎是相同的东西,一个没有参数也没有返回的方法。

目前您的问题太模糊了。特别是,您在标题和标记中提到了抽象类,但在正文中没有提到。如果您有一段特定的Java代码,请发布它。他提到了一个名为“Abstract”的类。可能是相关的。不,类Abstract等于Abstract:)在Java示例中,您也没有真正实例化抽象类,尽管看起来是这样的。实际情况是,您隐式定义了一个新的、具体的类,该类派生自
TestAbstract
,并重写了一个特定的方法。如果您需要实例化一个抽象类,它可能不应该是Java中的抽象类,我可以,但我需要的是实现抽象方法,但是,我可以像匿名实现那样做。在这种情况下,no-C#(据我所知,不允许您创建抽象类的匿名实现)。您仍然没有实例化抽象类,而是实例化了一个匿名子类。是的,我理解,但是没有创建新类型,只创建抽象体的匿名实现。@jitm:它仍然创建一个新类型。是的,我的问题是我可以像java(使用匿名)一样创建实例吗?目前我知道我不能。谢谢。在某些(大多数?)情况下,你应该用委托来代替匿名类,你会写更少的代码…特别是用一个方法类。2帕布罗:你能举个例子说明如何做到这一点吗,因为目前我已经从抽象中创建了简单类并使用了它。
AbstractClass instance = new ChildClass();
   Comparator<Object> comparator = new Comparator<Object>{
        @Override
        public int compare(Object o1, Objecto2) {
            return o1.getClass().getSimpleName().compareTo(o2.getClass().getSimpleName()));
        }//I'm not checking for null for simplicity
   } 
   Collections.sort(list, comparator)
Comparison<Object> comparison = delegate(Object o1, Object o2)
{
    return o1.class.Name.CompareTo(o2.class.Name);        
};

list.sort(comparison);
list.sort((o1, o2) => o1.class.Name.CompareTo(o2.class.Name))