被重写方法的多态参数

时间:2014-03-03 19:59:46

标签: java arguments override polymorphism

我们需要构建一个Resource,它可以是以下两种类型之一:LogicalPhysical。对于每个资源子类型,我们附加了Configuration,可以是LogicalConfigurationPhysicalConfiguration

这样做是因为配置对象是可编辑的,需要进行版本控制。例如资源可以有两个配置版本:active和draft。 Resource中提供了一种方法来添加配置addConfiguration(Configuration config)

现在,我们遇到了一个问题,LogicalConfiguration可能会错误地传递给addConfiguration的{​​{1}}方法。

PhysicalResource

此调用将成功,并且将添加错误的配置。可以使用以下方法来避免这种情况。

  1. 我们执行Resource resource = new PhysicalResource() Configuration config = new LogicalResourceConfiguration(); physicalResource.addConfiguration(config) 检查或定义成员instanceOf,但这会杀死多态性。
  2. 我们创建了两个方法Type / addLogicalConfiguration其中一个方法在运行时失败。
  3. 解决此问题最合适的方法是什么?或者是否有解决这类问题的具体模式?

3 个答案:

答案 0 :(得分:1)

您可以向Resource类添加泛型类型参数:

class Resource<T extends Configuration> {
    public void addConfiguration(T config) {}
}

然后,您可以:

class PhysicalResource extends Resource<PhysicalConfiguration> {...}

class LogicalResource extends Resource<LogicalConfiguration> {...}

答案 1 :(得分:0)

当尝试向Configuration添加错误的Resource类型时,通过提供编译错误,此结构应符合您的期望:

abstract class Configuration  {
}
   class LogicalConfiguration extends Configuration  {
   }
   class PhysicalConfiguration extends Configuration  {
   }
abstract class Resource<C extends Configuration>  {
   private C config;
   public void addConfiguration(C config)  {
      this.config = config;
   }
   public C getConfig()  {
      return  config;
   }
}
   class LogicalResource extends Resource<LogicalConfiguration>  {
   }
   class PhysicalResource extends Resource<PhysicalConfiguration>  {
   }

完全按照您的示例使用它:

Resource resource = new PhysicalResource()
Configuration config = new LogicalResourceConfiguration();

//COMPILATION ERROR:
physicalResource.addConfiguration(config);                        

答案 2 :(得分:0)

将这些课程放入他们自己的包中,并在addConfiguration受保护的Resource中进行操作。

这样,任何使用你的软件包的人都会在代码编写时发现错误。