问题 是否有在C#中创建匿名子类的语法?


我可以创建实例吗? 抽象 在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#做这样的事吗?


7045
2017-08-09 18:31


起源

目前你的问题是 远 太模糊了。特别是,您在标题和标签中提到了抽象类,但在文本正文中没有。如果您有一个特定的Java代码,请发布它。 - Jon Skeet
他提到了一个名为“Abstact”的课程。可能是相关的。 - Hans Passant
不,类抽象等于抽象:) - jitm
你不是真的在Java例子中实例化一个抽象类,尽管它看起来那样。真正发生的是你隐含地定义了一个新的, 具体 派生自的类 TestAbstract 并覆盖特定方法。 - Roman Starkov
如果需要实例化一个抽象类,它可能不应该是一个抽象类 - ravibhagw


答案:


无论是在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的委托,它几乎是一样的,一个没有参数且没有返回的方法。


8
2017-08-09 19:27



是的,我的问题是我可以在java中创建实例(使用匿名),目前我理解我不能。谢谢。 - jitm
在某些(大多数?)情况下,您应该使用委托替换匿名类,并且您将编写更少的代码...特别是使用一个方法类。 - Pablo Grisafi
2 Pablo:你能不能发布示例如何做到这一点,因为目前我已经从abstract创建了简单的类并使用它。 - jitm
发表在答案...编辑... - Pablo Grisafi
谢谢,这是很好的答案...... - jitm


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

public abstract class AbstractClass
{
}

public class ChildClass : AbstractClass
{ 
}

方法是:

AbstractClass instance = new ChildClass();

8
2017-08-09 18:33





不,你不能 - 这就是为什么这个类被称为抽象。您可以从中派生,从而创建可以实例化的具体实现类。


-1
2017-08-09 18:34





如果你在谈论一个抽象类,答案是否定的。它们几乎就像接口,但允许以后可以由具体对象使用的实现。 您必须创建一个继承自抽象类的具体类

更多信息请访问 抽象类


-1
2017-08-09 18:34



请不要发布.NET 1.1链接! - John Saunders


在这种情况下,C#与Java相同,您无法实例化抽象类。


-2
2017-08-09 18:42



在Java我可以,只有我需要它是实现抽象方法,但是,我可以像匿名实现一样。 - jitm
在那种情况下,然后没有 - C#(据我所知,不允许你创建一个抽象类的匿名实现)。 - RQDQ
您仍然没有实例化抽象类,您正在实例化一个匿名子类。 - Struan
是的,我理解,但没有创建新类型只有抽象体的匿名实现。 - jitm
@jitm:它仍然会创建一个新类型。 - Timwi