关于从基类扩展的类的问题(Java)

时间:2015-12-25 22:22:04

标签: java inheritance interface abstract

我是Java的初学者,试图为我正在编写的游戏编写一个派对任务系统,我有几个问题我想回答。我已经四处走动并问其他人,但他们对Java并不熟悉。

在过去,我尝试制作一堆类并使用多个get方法访问它们。我发现写作非常乏味,并认为我可以在抽象类/实现类下统一它们。因此,代码看起来更像是......

DynastyPQInterface pq = new CustomPQ // or ....
DynastyPQInterface pq = new OtherCustomPQ

当然,这带来了诸如仅能够使用实现方法的困难。它不允许我访问我以后可能想要使用的类的独占方法。

最终,我想要做的是能够使用单个get方法返回任何这些派生类,但仍然保留了普遍使用get方法来调用它们共有的方法的能力,例如作为执行,创建,结束,同时允许我专门接触他们的独家方法。有办法做到这一点,还是不可能?

如果还不清楚......

我现在编写的代码是一个基类,以...的方式扩展到其他类。

DynastyPQ (base) -> methods include (run(), execute(), end())
CustomAPQ (inherited from DynastyPQ) -> (has exclusive methods like getPoints())
CustomBPQ (inherited from DynastyPQ) -> (has exclusive methods like revivePlayer())

我想写一个get方法,以便摆脱多重。我现在拥有的是......

DynastyPQ dynastyPQ;    

DynastyPQ getPQ() {
    return dynastyPQ;
}

void setPQ(DynastyPQ pq) {
    dynastyPQ = pq;
}

这样做......

DynastyPQ pq = new CarnivalPQ();

我只能使用DynastyPQ的方法而不是嘉年华的方法。

有没有办法访问独占方法,同时普遍能够执行四个基本函数而不考虑类的类型,或者我是否先前错过了什么?

tl; dr - >我想要一个get方法,它通用地返回从类 X 继承的所有类;但是,我希望能够访问每个类的独占方法。

2 个答案:

答案 0 :(得分:0)

您可以将对象强制转换为派生类:

DynastyPQ pq = new CustomAPQ();
((CustomAPQ)pq).customAPQmethod();

如果您不知道动态类型是什么( new 运算符后使用的类型),您可以使用 instanceof 关键字:

DynastyPQ pq = getPQ();
if (pq instanceof CustomAPQ) {
    CustomAPQ a = (CustomAPQ)pq;
    a.customAPQmethod();
} else if (pq instanceof CustomBPQ) {
    CustomBPQ b = (CustomBPQ)pq;
    b.customBPQmethod();
} else {
    // Neither a CustomAPQ nor a CustomBPQ.
}

如果您不想这样做,可以使用多态:

class DynastyPQ {
    final void run() {
        // code.
    }
    final void execute() {
        // code.
    }
    final void create() {
        // code.
    }

    void specific1() {}
    void specific2() {}
}

class CustomAPQ extends DynastyPQ {
    @Override
    void specific1() {
        // do stuff specific to CustomAPQ.
    }
    @Override
    void specific2() {
        // do stuff specific to CustomAPQ.
    }
}

class CustomBPQ extends DynastyPQ {
    @Override
    void specific1() {
        // do stuff specific to CustomBPQ.
    }
    @Override
    void specific2() {
        // do stuff specific to CustomBPQ.
    }
}

现在,你可以这样做:

DynastyPQ pq = new CustomAPQ();
pq.specific1();

被调用的方法是CustomAPQ::specific1()。如果specific1()中未声明CustomAPQ,那么它将无所作为。

答案 1 :(得分:0)

除了@CelineNOEL之外,建议不可能。因为您声明了一个类型为DynastyPQ的类,所以只能调用该类中定义的方法。在您想要调用特定方法而不是共享方法的那一刻,您知道它来自哪个类,您可以使用强制转换来调用该特定方法。

((CustomAPQ)pq).customAPQmethod()

您在代码中使用的共享方法,当您不知道哪个类应该执行相同的代码安静时(或者如果您覆盖每个子类中的共享方法,您希望它执行它不同),并且您委托它在运行时解决。因此,重新考虑您的设计和基类中需要动态调用的方法。您确定的所有其他方法都特定于仅在该类中放置的一个类。通过这种方式,您的代码将更加清晰,您不会混淆应该分开的东西。