小编Mic*_*lak的帖子

如何使用C#中的委托实现使用接口和实现类的类似设计(来自Java)

我在Java(7)应用程序中有以下设计:

有一种方法可以传递某些类型和对象的集合,我将其称为"谓词",用于过滤给定的集合.

Predicate是一个名为test的方法的接口 - 它接受一个对象并返回一个布尔值.

在这种情况下:

  • 任何人都可以通过创建实现Predicate的类来编写它自己的Predicate接口实现
  • 任何人都可以通过在调用过滤方法期间创建匿名实现来编写自己的Predicate接口实现
  • 有预定义的一组实现Predicate的类,它涵盖了许多标准情况,因此在大多数情况下不需要编写新的实现.
  • 还有一个实用程序类提供了几个静态方法,如and,or,allOf,anyOf,它允许将作为输入的谓词组合成一个新的谓词(在内部它将返回新谓词的匿名实现)

现在我想在C#(4.0)应用程序中有类似的设计.我可以看到两种方式 - 通过模仿Java设计,或通过将Predicate更改为委托:

我可以尝试模仿Java设计,但是:

  • 据我所知,在C#中没有匿名的接口实现(所以在调用filter方法时没有创建新的谓词,而我的util类不必基于匿名实现,但第二个不是真正的问题)
  • 我觉得这不是C#这样做的事情

我可以尝试使用委托来实现类似的设计.我的过滤方法将采用对象和谓词委托的集合.在这种情况下:

  • 当一个人能够编写一些"实现"委托的类型时,我不知道如何实现这种情况.我想象有人会用类似于委托签名的方法编写类的情况 - 我对这个策略感觉不好,因为如果我有实现的接口 - 编译器会强迫我有正确的签名 - 因为我不能"扩展"或"实现"委托 - 只有当我尝试将"引用"传递给我的过滤方法时,编译器才会告诉我错了(当然它仍然是编译时错误).
  • 任何人都可以通过传递lambda或指向一些匹配Predicate委托的签名方法来编写它自己的Predicate接口实现.所以这里将与Java相同
  • 当我有预定义的谓词集时,我不知道如何实现这种情况.从技术角度来看,我当然可以看到这很简单 - 例如,我可以使用静态方法编写一个类来匹配委托的签名 - 每个方法都将覆盖一个谓词.但我觉得这种方法有点不一致 - 因为会有一个地方有预定义的谓词,而用户的谓词将在另一个地方定义(在Java中,预定义和用户定义的谓词都将是实现接口的类)
  • 如果Predicate是委托 - 我也可以编写一些可以通过多种方式组合谓词的Util类.这与Java中的相同

我的问题是 - 您认为在Java中实现相同(或尽可能相似)设计的最佳方式是什么,这将被视为正确,干净的C# - 这样做的方法?

我在Java编程方面有几年的经验,但在C#中不到一年的经验,所以我理解我可能看到的一些问题在C#世界中根本不存在或根本不被视为问题.

编辑:这是最简单的(我认为......)我的Java代码如何工作的可能示例:

我的"域名"对象:

public class Person {

    private final String firstName;
    private final String secondName;

    public Person(String firstName, String secondName) {
        this.firstName = firstName;
        this.secondName = secondName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String …
Run Code Online (Sandbox Code Playgroud)

c#

5
推荐指数
1
解决办法
182
查看次数

标签 统计

c# ×1