寻找某种模式

时间:2011-06-20 20:37:14

标签: java android

我有一个包含抽象类的库项目,比方说ClassA。在使用该库项目的项目中,我ClassB扩展了ClassA

现在这是我的问题。在库项目中,我想使用已实现的ClassB的实例,但我不知道如何检索该实例。对此有任何模式或其他想法吗?

Here's一个简单的情况图。

修改

我问的原因是我正在创建多个应用程序,这些应用程序在ClassB中只有不同的方法。因此,我正在创建一个所有这些应用程序都可以使用的库,只需要扩展ClassA。这些应用程序是使用库的单独项目。

6 个答案:

答案 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)

所以你正在编写一个抽象类,并且希望它能够获得该类的所有未知子类的对象?听起来像你想要一个面向方面的管理,如AspectJPicoContainer

答案 5 :(得分:0)

我写这篇文章时感到恶心,因为你的设计存在缺陷,但是你问你会怎么做......所以这就是:

Class<?> bClass = Thread.currentThread().getContextClassLoader().loadClass("com.foo.ClassB");

然后你可以做类似的事情:

if (object.getClass() == bClass) { ... }

我会认真地推荐一个更好的解决方案。尝试在一个项目中编写代码,然后重新分解可构成“库”的常见事物。