.net 在C#中创建匿名子类有语法吗?

lyr7nygr  于 2023-11-20  发布在  .NET
关注(0)|答案(4)|浏览(130)

我可以像在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#中做这样的事情吗?

ttvkxqim

ttvkxqim1#

在Java和C#中,你都不能创建抽象类的示例。你总是需要创建一个继承自抽象类的具体类。Java允许你使用匿名类而不命名类。C#没有给你给予这个选项。
(编辑以显示委托作为替换。我在这里没有访问VS的权限,所以它可能无法编译,但这是想法)
通常在Java中,当你使用一个带有单个抽象方法(SAM)的抽象类时,你真正想做的是传递一些代码作为参数。(采集,对照品)(我知道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及更高版本中,你可以使用类型推断(typedinference)和类型推断(typedinference)编写更少的代码:

list.sort((o1, o2) => o1.class.Name.CompareTo(o2.class.Name))


无论如何,如果你要把代码从java迁移到c#,你应该读一下委托..

bnl4lu3b

bnl4lu3b2#

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

public abstract class AbstractClass
{
}

public class ChildClass : AbstractClass
{ 
}

字符串
是:

AbstractClass instance = new ChildClass();

9lowa7mx

9lowa7mx3#

可选:Func<>类型的init属性

我需要对一个使用TcpClient(很难模拟)的类进行单元测试。
在要测试的类中:

public Func<string, int, CancellationToken, Task> CheckConnectivityAsync { get; init; } =
    async (host, port, cancellationToken) =>
    {
        using var tcpClient = new TcpClient();
        // etc.
    };

字符串
在单元测试类构造函数中:

_testSubject = new MyClass(context)
    {
        CheckConnectivityAsync = _mockCheck.Object
    };


有了正确的包名,你可以加强属性的可访问性(而不是使用public)。

h9a6wy2h

h9a6wy2h4#

你的例子为一个抽象类使用了一个匿名实现。C#不支持匿名实现,所以你需要创建另一个扩展它的实现。
public abstract class { }
public class Uncategorized { }

相关问题