gpt4 book ai didi

java - 处理仅对层次结构的一部分有意义的二元运算

转载 作者:行者123 更新时间:2023-12-01 16:05:06 24 4
gpt4 key购买 nike

我有一个接口(interface) Value 实现的层次结构,我将大大简化它。假设我有两个实现:NumberValue 和 StringValue。

有一个平均运算,仅对 NumberValue 有意义,其签名为

数值平均值(数值数值){...}

在创建此类变量并在各种集合中使用它们之后的某个时刻,我需要对一个我知道只是 NumberValue 类型的集合进行平均,我认为有三种可能的方法:

  1. 非常复杂的通用签名,在编译时保留类型信息(我现在正在做的事情,导致代码难以维护)
  2. 将操作移至 Value 级别,并且:针对 StringValue 抛出 unsupportedOperationException,并对 NumberValue 进行强制转换。
  3. 在我确信我有一个 NumberValue 的时候进行转换,使用稍微简单一点的泛型来确保这一点。

有人对 oop 最佳实践有更好的想法或建议吗?

最佳答案

正如@tafa所说,在我看来,界面将是一个不错的选择。基于您的签名 average ,我想出了以下内容。

平均值(value)

public interface AveragableValue<T> extends Value
{
public T average(T value);
}

数值

public class NumberValue implements AveragableValue<NumberValue>
{
private int _n;
public NumberValue(int n)
{
this._n = n;
}

@Override
public void doSomething()
{
// from Value interface
}

@Override
public NumberValue average(NumberValue value)
{
return new NumberValue((this._n + value._n) / 2);
}
}

然后你可以让你的 Collection 类型为 AveragableValue 。您的代码中必须已经有某种 if/else区分某处的子句 NumberValueStringValue确定是否调用average或不。所以我不明白这会变得更复杂。层次结构是有意义的 - AveragableValue s 是 Value 的子类型,以及 NumberValueAveragableValue 的一种类型.

但是,average 的签名看起来不对。它只需要 2 个值( this 和参数)并对它们求平均值。然后你就会失去之前平均过的总数。因此,假设整数作为值(就像我所做的那样),如下所示:

(new NumberValue(4)).average(new NumberValue(8)).average(new NumberValue(12));

会给你值 9而不是8 。这是你想要的吗?这对于迭代完成的许多计算来说很糟糕,就像您可能对集合所做的那样。

如果您向我们展示一些代码 - 如何使用这些类、保存它们的集合、您现在如何进行平均 - 我也许可以给出更好的答案。

关于java - 处理仅对层次结构的一部分有意义的二元运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2773717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com