我希望能够对对象实例执行“数学”操作。假设我有一个课程,Fruit
然后是附加课程。Orange(Fruit)
Apple(Fruit)
Apple
具有颜色属性,并且该类知道“红苹果”与“绿”或“黄”苹果不同的面孔。
现在我希望能够:
1) 表示特定水果实例的数量。例如 3 个红苹果或 2 个橙子或 1 个香蕉(是的,这可能需要一个新的香蕉类)。
2)代表“水果袋”。例如 1 个红苹果和 2 个橙子。或 1 个红苹果和 2 个橙子
3)按预期对“水果袋”和“水果数量”进行操作。即“2个红苹果”+“1个红苹果和1个橙子”=>“3个红苹果和1个橙子”甚至可能是“2个红苹果”* 2 =>“4个红苹果”等等。
现在,在某些方面它看起来类似于Counter
该类的功能,但我不确定我应该如何实现它。
我在这里的基本困境是,该类似乎Counter
根据它们的散列确定两个对象是否相同,并根据相同的散列进行分组,并且没有为我提供一个选项来决定分组“3 red”的键苹果”是“红苹果”。
我知道如何处理所有的数学重载问题,我想我可以从头开始实现它,但我希望有一些其他现成的解决方案可以支持这些概念。
实际的应用程序当然更复杂,但我认为我在这里描述的问题的解决方案很容易扩展到我的实际需求。
你会建议我采取什么方法?Counter 可以如何使用还是我需要自己完成完整的实现?
编辑 1:我真的很喜欢@jbndlr 关于“你说整数 w/值 3,而不是 3 个整数”的评论。但是有区别...
您如何将一个值为 1 的整数、一个值为 1 的整数和一个值为 4 的第三个整数一起计算?三个整数是正确的答案吗?或者也许是“2个整数整数w/值1和1个整数w/值4?
数数不像求和...
从某种抽象层面来看,它会根据事物的类型发送计数,这将迫使你在 '1 red_apple' 和 '1 apple which is red' 之间做出强烈区分,即 '1 red_apple' + '1 green_apple 只是 '1 red_apple + 1 green_apple' (因为 green_apple 与 red_apple 不同),而 '1 apple which is red' + '1 apple which is green' 可以认为是 '2 apples' (因为一个苹果任何其他颜色都会像苹果一样)
问题是,如果您的应用程序域要求您按颜色对苹果进行分组,您仍然不想被迫创建 3 个不同类别的苹果,您只想按颜色区分苹果实例。
这可能是我走错了路,决定如何计数的正确方法是由进行实际计数的人进行,以便您可以提供散列方案作为调用某些 CounterFactory 函数的一部分是否会返回一个计数器,该计数器知道他对任何提供的某种类型的对象实例的期望。
另一种选择是假设每种类型只能以某种特定方式可数,并且由类知道计算其实例的正确方法是什么,因此提供类似 __counting_key__ 的东西来支持向后兼容的方式来控制Counter 类的行为。
感谢所有出色的答案,我当然有足够的能力与之合作。我会接受看起来最接近我最终实际选择的解决方案的那个。