【问题标题】:Reuniting similar classes with different templates用不同的模板重新组合相似的类
【发布时间】:2022-07-29 13:01:33
【问题描述】:

上下文

我想为我的 JavaFX 应用程序创建颜色映射,以便根据它们的值显示具有不同颜色的网格。定义了两种类型:DiscreteColorMap 使用 integer 键和 ContinuousColorMap 使用 double 键。两者都必须实现接口ColorMap,这样才能这样调用:

ColorMap palette1 = new DiscreteColorMap();
ColorMap palette2 = new ContinuousColorMap();

问题

由于两个类都依赖于相同的接口,我指定了一个模板 (public interface ColorMap<T>) 以适应它们中的每一个:

ColorMap<Integer> palette1 = new DiscreteColorMap();
ColorMap<Double> palette2 = new ContinuousColorMap();

我想要颜色图的最简单语法,所以我需要去掉 &lt;Integer&gt;&lt;Double&gt; 字符串。最优雅的方法是什么?

来源

完整的代码可以在这个GitHub project找到。

【问题讨论】:

  • NumberIntegerDouble 的超类,使用 &lt;Number&gt; 应该适用于两者。
  • &lt;Integer&gt;&lt;Double&gt; 这里不是字符串。不清楚你在问什么。为什么要“摆脱它们”?
  • 类型参数是可选的,可以写成:ColorMap cm = new DiscreteColorMap();。这使用了所谓的“原始类型”。但是您会丢失特定的类型信息,因此不建议使用原始类型。 IDE 将突出显示它们并建议再次添加类型参数。

标签: java oop templates javafx design-patterns


【解决方案1】:

您可以在接口类型中使用基类或超类,然后在您的类中继承此接口,例如DiscreteColorMapContinuousColorMap

让我通过 C# 展示一个示例。

这是基类或超类(在您的情况下为Number):

public class Fruit
{ 
}

及其派生类(在您的情况下为IntegerDouble):

public class Apple : Fruit
{ }

public class Pineapple : Fruit
{ }

带有 super 或 base 参数的通用接口看起来像这样:

public interface IColorMap<T> where T : Fruit
{
    void Do();
}

及其具体实现:

public class DiscreteColorMap : IColorMap<Apple> 
{
    public void Do()
    {
        Console.WriteLine("I am DiscreteColorMap");
    }
}

public class ContinuousColorMap : IColorMap<Pineapple> 
{
    public void Do()
    {
        Console.WriteLine("I am ContinuousColorMap");
    }
}

那么你可以像这样使用上面的代码:

IColorMap<Apple> applePalette = new DiscreteColorMap();
applePalette.Do(); // OUTPUT: I am DiscreteColorMap

IColorMap<Pineapple> pineapplePalette = new ContinuousColorMap();
pineapplePalette.Do(); // OUTPUT: I am ContinuousColorMap

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多