等价于C#中Java的匿名类? - java

我正在尝试将用Java编写的SDK移植到C#。

在此软件中,有许多带有多种方法的“处理程序”接口(例如:带有attemptSomethingHandlersuccess()和几种不同的故障方法)。然后,该接口在调用类中实现并匿名实例化,并传递给attemptSomething类的SomethingModel方法。这是一个异步方法,在多个地方可能会失败或调用另一个方法(在处理程序上传递)。这样,attemptSomethingHandler的匿名实现可以在调用attemptSomething的类中引用私有方法。

在C#中,不可能匿名实现接口。我可以显式实现一个新类,但是该实现对于此调用类是唯一的,不会用于其他任何事情。更重要的是,我将无法访问调用类中的私有方法,这是我所需要且不想公开的。

基本上,我需要根据SomethingModel类方法中发生的事情运行与调用类不同的代码。

我一直在阅读委托,但是这需要传递与处理程序接口中存在的方法一样多的委托(据我所知)。
在C#中执行此操作的合适方法是什么?我觉得我错过了一种非常通用的编程策略。只是必须有一种简单,干净的方法来构造和解决此问题。

参考方案

在C#中,我们本身没有像Java这样的匿名类型。您可以创建一个包含如下字段的匿名类型:
var myObject = new { Foo = "foo", Bar = 1, Quz = 4.2f }
但是,这些方法不能在其中放置方法,只能通过使用objectdynamic传递到方法中(由于它们在编译时没有类型,因此由编译器AFAIK生成)

正如您所说,在C#中,我们使用委托或lambda。

如果我正确理解您的泡菜,则可以实现嵌套的私有类,如下所示:

interface IMyInterface
{
    void Foo();
}

class MyClass
{
    public void Bar()
    {
        var obj = new MyInterface();
        obj.Foo();
    }

    private class MyInterface : IMyInterface
    {
        public void Foo()
        {
            // stuff
        }
    }
}

现在MyClass可以创建实现MyInterfaceIMyInterface实例。正如评论员所提到的,MyInterface可以访问MyClass的成员(尽管您最肯定希望尝试并坚持使用这两种类型的可公开访问的成员)。

这封装了“匿名”类(此处使用Java术语使其更简单),并且还意味着您有可能以MyInterface的形式返回IMyInterface,而其他软件则再合适不过了。实际上,这就是某些抽象工厂模式的工作方式。

基本上,我需要根据SomethingModel类方法中发生的事情运行与调用类不同的代码。

这闻起来很重。噢亲爱的!

在我看来,您的特定问题可以使用重构。在C#中,您可以使用事件来解决此问题(注意:可以,不应该)。只要为方法的每个“分支”点都有一个事件。但是,我必须说,这确实使您的解决方案难以设想和维护。

但是,我建议您以一种不需要如此繁琐的耦合的方式来设计解决方案。

您也可以尝试使用管道模型,但是我不确定如何自己实现。我知道码头(或者是Netty?JBOSS的Java NIO)肯定使用了类似的模型。

您可能会发现,抛出一些单元测试以测试类的预期功能将使构建解决方案(TDD)更加容易。

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

Java:从静态方法获取继承的类的类 - java

我在Java中遇到以下问题:我有一个基类和一个派生类,并且在基类中有一个方法。当我通过Derived调用Base的foo方法时,我想获得Derived的类。如果可以通过这种方式完成,则foo方法可以是通用的。class Base { static void foo() { // I want to get Derived class here // Deri…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…