在C#中是否有创建匿名子类的语法?
我可以像在Java中一样在C#/.net中创建抽象类的实例吗 附加信息 我想我们很多人都不明白我的意思是什么? 因此,在java中,I可以创建如下抽象类: 简单抽象类:在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
/**
* @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))