【发布时间】:2012-05-24 14:15:01
【问题描述】:
我正在考虑如何使用面向对象的方法正确解决这个问题。语言并不重要——我其实很想写代码,但我更关心的是一般原则。
我想实现一个field:一个“数字”的集合,+、-、* 和 / 操作在这些“数字”上进行。此外,我希望能够实现更高的操作,例如 ^ 和循环查找,其中 (1) 不需要为给定字段定义,但 (2) 可以在需要时被覆盖,例如出于效率原因。
问题来了。声明还不够好
FieldElement power (FieldElement base, FieldElement exponent)
因为我想要类型安全:不可能将有限域的成员添加到整数。
也许我真正在寻找的是元对象,或超级接口,或将不同类联系在一起的东西(一个用于整数,一个用于 7-adics,一个用于有限域 F_4 等) .或者也许有更好的东西。
注意欢迎(甚至鼓励)在答案中使用代码,如果它有启发性的话,但声明可能就足够了:大概这里的每个人都可以为至少几个领域写出明显的方法。
我会提到其他对我很重要但(显然)与主要 OO 问题无关的条件:我不希望字段元素携带它们的类型信息,而且我希望它们是轻量级的(因为我可能需要处理大量的字段元素)。这些需求可能无法实现——尽管坦率地说,我更可能在这里放弃面向对象而不是效率。但无论如何,我们都将不胜感激,因为我有兴趣了解这些问题,即使除了手头的特定问题。
【问题讨论】:
-
“语言不重要”——我很确定。例如,对此的 C++ 解决方案可能是模板,它在 Java 中不存在(它们确实存在,某种程度上,以泛型的形式)。
-
嗯,这不太正确。例如,您可以说这需要有界参数多态性,并且鉴于此,您在语言 X 中能做的最好的事情就是使用特征 Y。语言特征并不是孤立存在的——人们在计算机上工作是有报酬的 科学 ...但我想你可能会争辩说你最好在不同的网站上问这个问题(compsci 是什么?)
-
你可以试试cs.stackexchange.com
-
这是一个我觉得可以在几个不同的地方问的问题的例子。我确定它会在 cstheory.se 关闭,但也许 cs.se 会接受它。
-
嗯。我不知道两者都存在。 cstheory是研究吗?无论如何,就个人而言,我很高兴你在这里问。对空指针、采访和正则表达式进行更改。
标签: oop language-agnostic computer-science liskov-substitution-principle