我可以创建实例吗? 抽象 在C#/ .net中的类与Java一样?
附加信息
我想我们很多人都不懂我的意思?
所以,在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<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相同,您无法实例化抽象类。