Oop 是否有更好的方法检查具有可选接口的成员的集合?
我有一个configuration registry类,它包含一组具有特定接口的配置类。这些类还可以有一个可选接口。因此,这些类在伪代码中可能如下所示:Oop 是否有更好的方法检查具有可选接口的成员的集合?,oop,design-patterns,Oop,Design Patterns,我有一个configuration registry类,它包含一组具有特定接口的配置类。这些类还可以有一个可选接口。因此,这些类在伪代码中可能如下所示: class ConfigurationRegistry { private ModuleConfiguration[]; public function ConfigurationRegistry(ModuleConfiguration[] collection) { this.collection = c
class ConfigurationRegistry {
private ModuleConfiguration[];
public function ConfigurationRegistry(ModuleConfiguration[] collection) {
this.collection = collection;
}
public function getCollection() {
return this.collection;
}
}
在我的客户机代码中,我希望使用这些配置类。有时我需要整个配置类集合,有时我只需要实现SpecificConfiguration
接口的配置类集合
我可以使用instanceof
过滤收集方法,或者我可以循环收集并检查类是否实现了接口。但我在网上读过不少文章,说在这种情况下使用instanceof
被认为是不好的做法
我的问题是:我的实现是一个好的设计吗?如果没有,您对我如何重新设计或改进这一点有什么建议吗?从严格的面向对象的角度来看,您应该始终尝试使用多态性。但您正试图拥有一个异构集合,它可以很容易地在函数式编程语言中使用联合类型建模,但在面向对象编程语言中则不然。关于“如何改进我的设计”,回答起来并不容易。为什么客户端代码需要区别对待
模块配置
和特定配置
?为什么需要ConfigurationRegistry
来接受这两种类型?为什么一开始就需要两种类型?等等。@Federkun感谢您的评论!客户端代码需要以不同的方式对待代码,因为我只想使用SpecificConfiguration
界面中提供的值调用某些服务。这些值在配置类中是可选的,因此我想过滤掉其他值。我可以将SpecificConfiguration
和ModuleConfiguration
接口合并到一个接口中,但是SpecificConfiguration
不再是可选的。
class ConfigurationClass1 implements ModuleConfiguration, SpecificConfiguration {
public function moduleMethod() {
// do something
}
public function specificMethod() {
// do specific thing
}
}
class ConfigurationClass2 implements ModuleConfiguration {
public function moduleMethod() {
// do something
}
}
public interface ModuleConfiguration {
public function moduleMethod();
}
public interface SpecificConfiguration {
public function specificMethod();
}