gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:48:48 27 4
gpt4 key购买 nike

我是 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的方法,不能访问Carnival的方法。

有没有一种方法可以在不考虑类类型的情况下普遍执行四个基本函数的同时访问独占方法,还是我之前错过了什么?

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

最佳答案

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

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 中声明,那么它什么都不做。

关于java - 关于从基类扩展的类的问题(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34466929/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com