如果我们有一个抽象类,并且有几个类实现它,每个类都有不同的属性。 现在我有另一个(Manager类)持有一个抽象类的数组,并希望在其中放置一个搜索方法...如何在不转换为具体类的情况下实现呢?
我的想法有两个:
第一种:添加额外的接口(即不使用具体类而是用接口进行强制转换),这符合代码与接口而非实现的规则...但是当我添加另一个类时,我必须为其创建一个新接口并同时编辑manager(客户端),这似乎不太好。
第二种解决方案: 看起来有点奇怪,并且仍需要改进,但它的主要目标是使manager或任何其他客户端能够使用抽象类而不必知道是谁继承它或其属性。
解决办法如下: 每个添加的新项都必须覆盖一个接口,该接口强制其生成其字段的完整描述,例如,汽车对象将必须返回 一个哈希映射,其中包含以下内容
字段:{fieldType,fieldValue}
例如:
model:{text,“福特”} manifactureDate:{Date,“12/1/89”}
每个对象还必须实现一个名为compareFields的方法,该方法接受这样一个哈希映射并将其与其字段进行比较,并返回true或false。
现在,通过这种方式,我已经解决了许多问题 -对于GUI,我只需要为此哈希映射创建呈现引擎即可显示任何项,而不必知道其类型。 (GUI也是抽象类的另一个客户端) -对于搜索,我可以获得包含用户在搜索表单中输入的字段的哈希映射,并循环处理抽象项并调用compare fieldmethod
我仍然不知道如何处理复杂对象(其具有另一个对象作为其属性) 我不知道这是什么模式...这只是我想到的一个想法。
编辑:具体示例
如果我有一个抽象项目类,其中汽车、公交车和船只实现它,每个类都有不同的属性....例如,Traffic Manager如何使用抽象类搜索特定项,而无需转换为汽车或公交车... 非常抱歉问题很长。