我可以像在Java中一样在C#/.net中创建abstract类的示例吗?
Additional Info
我想我们很多人都不明白我的意思是什么?所以,在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#中做这样的事情吗?
4条答案
按热度按时间ttvkxqim1#
在Java和C#中,你都不能创建抽象类的示例。你总是需要创建一个继承自抽象类的具体类。Java允许你使用匿名类而不命名类。C#没有给你给予这个选项。
(编辑以显示委托作为替换。我在这里没有访问VS的权限,所以它可能无法编译,但这是想法)
通常在Java中,当你使用一个带有单个抽象方法(SAM)的抽象类时,你真正想做的是传递一些代码作为参数。(采集,对照品)(我知道Comparator是一个接口,但它的思想是一样的)使用匿名类来避免额外的输入,您可以编写如下代码:
字符串
在C# 2.0及更高版本中,你可以使用
Comparison<T>
委托来做几乎相同的事情。委托可以被认为是一个函数对象,或者在java单词中,一个带有单个方法的类。你甚至不需要创建一个类,而只需要使用关键字delegate创建一个方法。型
在C# 3.0及更高版本中,你可以使用类型推断(typedinference)和类型推断(typedinference)编写更少的代码:
型
无论如何,如果你要把代码从java迁移到c#,你应该读一下委托..
bnl4lu3b2#
不,不是直接的。你可以得到最接近的(假设你有下面的类结构):
字符串
是:
型
9lowa7mx3#
可选:Func<>类型的init属性
我需要对一个使用
TcpClient
(很难模拟)的类进行单元测试。在要测试的类中:
字符串
在单元测试类构造函数中:
型
有了正确的包名,你可以加强属性的可访问性(而不是使用
public
)。h9a6wy2h4#
你的例子为一个抽象类使用了一个匿名实现。C#不支持匿名实现,所以你需要创建另一个扩展它的实现。
public abstract class { }
public class Uncategorized { }