我可以像在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#做这样的事吗?
答案 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相同,您无法实例化抽象类。