1
8
你描述的问题叫做 double dispatch . 名称来自这样一个事实,即您需要根据两个对象的类型(因此:double)来决定要执行(分派)哪一位代码。 在OO中通常只有一个分派-对对象调用一个方法会导致该对象执行该方法的实现。 在您的例子中,您有两个对象,要执行的实现取决于这两个对象的类型。从根本上讲,当您以前只处理过标准的OO情况时,这意味着一个耦合“感觉错误”。但这并不是真的错——它只是稍微超出了OO的基本特性直接适合解决的问题领域。 如果您使用的是动态语言(或具有反射功能的静态类型语言,这对于实现此目的来说是足够动态的),那么可以使用基类中的Dispatcher方法来实现这一点。在伪代码中:
在这里,我想象语言在每个类中都有一个内置的方法
因此,您只需使用正确的名称编写一个方法,就可以进行分派。 在支持按参数类型重载方法的静态类型语言中,我们可以避免发明连接的命名约定——例如,这里是C:
如果您要向模型中添加一个新的类型,您需要查看以前的每一个类型,并询问您自己它们是否需要以某种方式与新类型进行交互。因此
每一个
类型必须定义与
每隔一个
类型-即使交互是一些非常简单的默认值(例如“除了返回什么都不做
因此,捕获外部表中所有类型之间的关系可能更有意义,而不是将其分散在所有对象周围。集中化的价值在于,您可以立即看到是否遗漏了类型之间的任何重要交互。 所以您可以有一个字典/map/hashtable(在您的语言中,无论它是什么)将一个类型映射到另一个字典。第二个字典将第二个类型映射到这两个类型的右比较函数。常规compareWith函数将使用该数据结构查找要调用的正确比较函数。 哪种方法是正确的将取决于您可能在模型中使用多少类型。 |
2
5
因为你提到
现在,我们定义了两个实现
这样我们就可以避免让一行接一行的if语句进行类型检查。但有一个警告。考虑此代码:
看到第三个测试了吗?尽管
这让你回到了正题一:使用
重新设计是正确的,但是没有更多的信息,我不能给你一个特别好的推动方向。 |
3
1
您需要创建一个名为criteria的超级类或接口。然后每个具体的子类将实现标准接口。介于,大于等是标准。 Criteria类将指定接受条件的MatchCompareCriteria方法。实际逻辑将驻留在子类中。 您正在寻找策略设计模式或模板设计模式。 |
4
1
如果我理解的很好,您的方法依赖于类型检查。这是很难避免的,多态性无法解决问题。从你的例子来看,伊纳瑞 需要 检查参数类型,因为方法的行为 取决于 对此。你不能通过多态性来做到这一点,这意味着你不能在类上放置多态方法来处理这种情况。那是因为你的比赛标准取决于 类型 参数而不是其上的 行为 .
不使用规则
结论:使用
这是一个较长的 article 我认为,这是史蒂夫耶格的一个简单而直截了当的例子。我认为这很适合你的问题。 记得: 多态性是好的,除非它不是 . :) |
5
1
smalltalk方法将为层次结构引入更多层。所以 之间 和 比大 将是 范围比较标准 (或其他东西),以及 范围比较标准::匹配比较标准 会回来 对 当被问到是否两个例子本身是可比的。 说到这一点,您可能想将“matchCompareCriteria”重命名为更好地表达意图的名称。 |
Eris · 纯虚拟成员有什么优势吗(除了他们可能防止的人为错误)? 2 年前 |
James Nguyen · Java多态性:为什么返回错误? 6 年前 |
Alex Cristea · 如何从另一个类的数组中打印特定行 6 年前 |
juztcode · C语言中的静态和动态分辨率++ 6 年前 |
Hugo · 具有多态关系的活动记录获取关联模型 6 年前 |
pooya13 · 机器代码层上虚函数和条件执行的区别 6 年前 |
Nisba · C中子类类型未知的模型类/子类++ 6 年前 |
R zu · 使用多次调用的可替换方法初始化 6 年前 |