我有一个包含抽象类的库项目,比方说ClassA
。在使用该库项目的项目中,我ClassB
扩展了ClassA
。
现在这是我的问题。在库项目中,我想使用已实现的ClassB
的实例,但我不知道如何检索该实例。对此有任何模式或其他想法吗?
Here's一个简单的情况图。
修改
我问的原因是我正在创建多个应用程序,这些应用程序在ClassB
中只有不同的方法。因此,我正在创建一个所有这些应用程序都可以使用的库,只需要扩展ClassA
。这些应用程序是使用库的单独项目。
答案 0 :(得分:1)
如果您的图书馆需要使用ClassB,那么ClassB应该是您图书馆的一部分。您的库不需要知道使用它的项目中的类。
如果你的图书馆只需要一个ClassA,并且你有一个ClassB,你可以在传递它之前将你的对象转换为ClassA,如下所示:
ClassB b = new ClassB();
ClassA a = (ClassA)b;
// pass a into your library
答案 1 :(得分:1)
您正在寻找的是Abstract Factory模式。在某些时候,应用程序代码(调用库的代码)需要传入一个Factory类,该类将由库用于创建ClassA对象的实例。在您的情况下,Factory类将生成ClassB的实例。
根据类的设计和功能,可能会将ClassA重新设计为接口,或者至少作为抽象类,作为此重构的一部分。
修改强>: 这是一个未经测试的伪示例:
此代码将在库中
class INeedAFactory {
public Interface MyFactory {
public ClassA makeClassAInstance();
}
private MyFactory m_factory;
public registerFactory(MyFactory factory) {
m_factory = factory;
}
private ClassA makeClassAInstance() {
// m_factory had better not be null!
return m_factory.makeClassAInstance();
}
private void ClassAConsumer() {
ClassA classA = makeClassAInstance();
// ... etc. ...
}
}
此代码位于应用程序中:
class LibraryPatron {
class MakeClassB implements INeedAFactory.MyFactory {
public ClassA makeClassAInstance() {
return new ClassB();
}
}
public LibraryPatron() {
INeedAFactory libraryObject = new INeedAFactory();
libraryObject.registerFactory(new MakeClassB());
// ... etc...
}
}
答案 2 :(得分:0)
将类B移动到与类A相同的库中。您的项目已经依赖于库,因此它仍然可以引用类B,但是类B现在也可以用于库中的其他类。
答案 3 :(得分:0)
目前还不是很清楚,但据我了解,如果你想获得ClassB
的实例,你只需要new ClassB()
...
答案 4 :(得分:0)
所以你正在编写一个抽象类,并且希望它能够获得该类的所有未知子类的对象?听起来像你想要一个面向方面的管理,如AspectJ或PicoContainer。
答案 5 :(得分:0)
我写这篇文章时感到恶心,因为你的设计存在缺陷,但是你问你会怎么做......所以这就是:
Class<?> bClass = Thread.currentThread().getContextClassLoader().loadClass("com.foo.ClassB");
然后你可以做类似的事情:
if (object.getClass() == bClass) { ... }
我会认真地推荐一个更好的解决方案。尝试在一个项目中编写代码,然后重新分解可构成“库”的常见事物。