Oop 是否有更好的方法检查具有可选接口的成员的集合?

Oop 是否有更好的方法检查具有可选接口的成员的集合?,oop,design-patterns,Oop,Design Patterns,我有一个configuration registry类,它包含一组具有特定接口的配置类。这些类还可以有一个可选接口。因此,这些类在伪代码中可能如下所示: class ConfigurationRegistry { private ModuleConfiguration[]; public function ConfigurationRegistry(ModuleConfiguration[] collection) { this.collection = c

我有一个configuration registry类,它包含一组具有特定接口的配置类。这些类还可以有一个可选接口。因此,这些类在伪代码中可能如下所示:

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();
}