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

时间:2010-08-09 18:31:35

标签: c# .net abstract-class instance

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

其他信息

我想我们很多人都不懂我的意思? 所以,在java中我可以创建这样的抽象类:

简单抽象类:

/**
 * @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#做这样的事吗?

3 个答案:

答案 0 :(得分:8)

无论是在Java还是在C#中,您都可以创建抽象类的实例。 您将始终需要创建一个继承自抽象类的具体类。 Java允许您在不使用匿名类命名类的情况下执行此操作。 C#没有给你这个选项。

(编辑以显示代理作为替代。我在这里无法访问VS,因此可能无法编译,但这是个主意)

通常在Java中使用带有单个抽象方法(SAM)的抽象类时,您真正想要实现的是将一些代码作为参数传递。 假设您需要使用Collections.sort(Collection,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)

在C#2.0及更高版本中,您可以使用Comparison<T>委托执行相同的操作。委托可以被认为是一个函数对象,或者在java单词中,可以被认为是一个具有单个方法的类。您甚至不需要创建类,只需要使用关键字delegate。

Comparison<Object> comparison = delegate(Object o1, Object o2)
{
    return o1.class.Name.CompareTo(o2.class.Name);        
};

list.sort(comparison);

在C#3.0及更高版本中,您可以使用lambdas和类型推断编写更少的代码:

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

无论如何,如果您要将代码从java迁移到c#,您应该阅读有关委托的内容......在许多情况下,您将使用委托而不是匿名类。在您的情况下,您使用的方法void toDoSmth()。有一个名为Action的委托,它几乎是一样的,一个没有参数且没有返回的方法。

答案 1 :(得分:7)

没有。不是直接的。你可以来的最近的(假设你有以下类结构):

public abstract class AbstractClass
{
}

public class ChildClass : AbstractClass
{ 
}

时:

AbstractClass instance = new ChildClass();

答案 2 :(得分:-3)

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