假设我有一个 A 类
class A
{
Z source;
}
现在,上下文告诉我“Z”可以是不同类(例如 B 和 C)的实例,它们在继承树中不共享任何公共类。
我猜天真的方法是让“Z”成为一个接口类,并让 B 类和 C 类实现它。
但是有些东西仍然不能说服我,因为每次使用 A 类的实例时,我都需要知道“源”的类型。所以所有都在多个“ifs”中完成,使得“is instanceof”听起来不太好。也许将来其他一些类实现 Z,并且硬编码这种类型的“ifs”肯定会破坏某些东西。
问题的根源是我无法通过向 Z 添加函数来解决问题,因为在 Z 的每个实例类型中所做的工作都是不同的。
我希望有人能给我和建议,也许是一些有用的设计模式。
谢谢
编辑:当获得某个 A 的实例时,“某人”在某个地方所做的工作完全不同,具体取决于接口 Z 后面的类。这就是问题所在,做“重要工作”的实体不是 Z,而是其他人想知道Z是谁。
Edit2:也许一个具体的例子会有所帮助:
class Picture
{
Artist a;
}
interface Artist
{
}
class Human : Artist { }
class Robot : Artist {}
现在某处我有一个实例Picture
,
Picture p = getPicture();
// Now is the moment that depending if the type of `p.a` different jobs are done
// it doesn't matter any data or logic inside Human or Robot