Java 重写方法的多态参数
我们需要构建一个Java 重写方法的多态参数,java,arguments,overriding,polymorphism,Java,Arguments,Overriding,Polymorphism,我们需要构建一个资源,它可以是两种类型之一:逻辑或物理。对于每个资源子类型,我们都附带了一个配置,它可以是逻辑配置和物理配置 这样做是因为配置对象是可编辑的,需要进行版本控制。例如,资源可以有两个配置版本:活动和草稿。Resource中提供了添加配置的方法addConfiguration(配置配置) 现在,我们面临一个问题,逻辑配置可能会错误地传递给物理资源的添加配置方法 Resource resource = new PhysicalResource() Configuration confi
资源
,它可以是两种类型之一:逻辑
或物理
。对于每个资源子类型,我们都附带了一个配置
,它可以是逻辑配置
和物理配置
这样做是因为配置对象是可编辑的,需要进行版本控制。例如,资源可以有两个配置版本:活动和草稿。Resource
中提供了添加配置的方法addConfiguration(配置配置)
现在,我们面临一个问题,逻辑配置
可能会错误地传递给物理资源
的添加配置
方法
Resource resource = new PhysicalResource()
Configuration config = new LogicalResourceConfiguration();
physicalResource.addConfiguration(config)
此调用将成功,并将添加错误的配置。可以使用以下方法来避免这种情况
instanceOf
检查或定义成员类型
,但这将杀死多态性addLogicalConfiguration
/addPhysicalConfiguration
其中一个在运行时失败解决这个问题最合适的方法是什么?或者是否有特定的模式来解决此类问题?您可以向资源类添加泛型类型参数:
class Resource<T extends Configuration> {
public void addConfiguration(T config) {}
}
类资源{
public void addConfiguration(T config){}
}
然后,您可以:
class PhysicalResource extends Resource<PhysicalConfiguration> {...}
class LogicalResource extends Resource<LogicalConfiguration> {...}
类物理资源扩展资源{…}
类LogicalResource扩展资源{…}
此结构应满足您的期望,在尝试将不正确的配置
类型添加到资源
时会出现编译错误:
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
中对addConfiguration
进行保护
这样,任何使用您的软件包的人都会在编写代码时发现错误。感谢您提供的通用解决方案,我们将继续这样做,但我们更希望在某些模式或实例中找到一些解决方案,作为这种情况下的一个好的替代方案。
Resource resource = new PhysicalResource()
Configuration config = new LogicalResourceConfiguration();
//COMPILATION ERROR:
physicalResource.addConfiguration(config);