我遇到了编程问题:
我的Eclipse IDE中有两个 Java 项目:ProjectA和ProjectB。 ProjectB引用ProjectA
我在ProjectA中声明了一个类:ClassA,在ProjectB中声明了一个类:ClassB,这样:
public class ClassA{
public static Object foo(){
//blah
}
}
public class ClassB extends ClassA{
public static Object foo(){
//blah
}
}
我在ProjectA中也有一个名为ClientClass的类。此ClientClass之前用于创建ClassA的实例并使用它。但是现在,基于环境设置,应该为ClientClass提供使用ClassA或ClassB的选项。
这似乎是AbstractFactory模式的一个问题,或者我认为。 我需要创建一个工厂,提供对ClassA或ClassB的访问。 ClientClass不应该知道它是ClassA或ClassB。这需要我为ClassA和ClassB创建一个接口。
我遇到的问题:
有人能为这个问题提出一个优雅的解决方案吗?
答案 0 :(得分:2)
嗯,这里有很多问题。对于初学者而言,这是最大的一个,但这不会起作用,因为你不能在Java中覆盖静态方法。我认为,你所说的目标是能够在运行时将ClassA替换为ClassB或B或A或其他任何东西,具体取决于某些参数。为此,您需要能够利用动态分派(或简单地说,虚拟方法),这将允许运行时系统选择要在运行时执行的方法的内存地址。静态方法无法做到这一点。您需要使方法非静态才能工作。您不必专门设计Java Interface
,但是当您使用ClassB扩展ClassA时,您将能够将对象视为仅仅是ClassA对象。
所有这些都说,如果你从方法中删除静态修饰符并使它们变为非静态,那么你可以在项目A中使用ClassB,而不会在你正在讨论的客户端类中有任何导入语句。但是,在项目A的某个地方,有人需要知道ClassB才能实例化它。当然,除非你想做一些运行时绑定并使用字符串动态加载类。这有意义吗?
答案 1 :(得分:0)
冷杉问题:你的B级和A级的foo方法是静态的。因此没有任何东西被覆盖。如果您打算在ClassB中覆盖foo,则不应将它们设为静态。
这里的第二个问题是上游需要了解下游。那是错的不是吗?
这是否是抽象因素模式的问题除此之外。设计模式只是使代码遵循已知的结构。它本身并不是目的。
目前,为什么Project A中的ClientClass需要了解ClientB?
至于工厂,您的工厂需要在项目B中,它可以是:
班级工厂{
public static ClassA createTheRightOne(EnvironmentSettings settings){//做正确的事情}
}
修复静态修改器