繁体   English   中英

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

[英]Is there a syntax for creating an anonymous subclass in C#?

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

附加信息

我想我们很多人都不懂我的意思? 所以,在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#做这样的事吗?

无论是在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)

在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的委托,它几乎是一回事,一个没有参数且没有返回的方法。

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

public abstract class AbstractClass
{
}

public class ChildClass : AbstractClass
{ 
}

方法是:

AbstractClass instance = new ChildClass();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM