小编use*_*746的帖子

在 Smalltalk 中,当发送者和参数属于不同类型时,定义可交换二进制方法的最佳方法是什么?

假设您有一个 Foo 类,并且您希望能够将一个 Foo 乘以一个 Number 以获得另一个 Foo,使用“@@”作为乘号。

由于乘法是可交换的,所以能够写出很好:

| f a b |
f := Foo new.
a := 3 @@ f.
b := f @@ 3.
self assert: a = b
Run Code Online (Sandbox Code Playgroud)

这不仅需要将二进制方法“@@”添加到 Foo 中,还需要添加到 Number 类中。所以你最终在两个不同的地方使用了本质上相同的方法(以及循环依赖),这看起来很不雅观。

所以我想知道,在 Smalltalk 中,有没有其他方法可以创建交换二进制方法,其中发送者和参数是不同的类型——一种不需要你在两个不同的类中定义相同消息的方法?

如果没有,是否可以使用 Smalltalk 本身来创建这种能力(即添加自动管理可交换二进制方法的类/方法,而不改变实际的 Smalltalk 语言或 VM)?

oop design-patterns smalltalk

7
推荐指数
1
解决办法
86
查看次数

为什么在OWL EL中添加析取会使计算更复杂?

我试图理解为什么向OWL EL添加析取会使语言在计算上更复杂(例如,为什么在多项式时间内添加'或'会使可满足性,一致性和/或包含检查变得不可能......他们是p-标准OWL EL中的时间)

除其他外,OWL EL概况不允许分离和否定.我无法理解为什么使用现有的OWL EL结构无法实现析取,通过创建包含给定类表达式的析取子集作为子集的新类.

例如,可以表达式(在曼彻斯特语法中):

  Class1 and (Class2 or Class3) and (Property1 some (Class3 or Class4))
Run Code Online (Sandbox Code Playgroud)

被改写为:

  Class1 and NewClass1 and (Property1 some NewClass2)

  where Class2 is a subset of NewClass1,
        Class3 is a subset of NewClass1,
        Class3 is a subset of NewClass2,
        Class4 is a subset of NewClass2
Run Code Online (Sandbox Code Playgroud)

我知道答案是'不',但为什么'不'?

complexity-theory rdf owl ontology protege

2
推荐指数
1
解决办法
68
查看次数