关于从基类扩展的类的问题(Java)
我是
Java的初学者,试图为我正在编写的游戏编写一个派对任务系统,我有几个问题我想回答.我已经四处走动并问其他人,但他们对Java并不熟悉.
在过去,我尝试制作一堆类并使用多个get方法访问它们.我发现写作非常乏味,并认为我可以在抽象类/实现类下统一它们.因此,代码看起来更像是…… DynastyPQInterface pq = new CustomPQ // or .... DynastyPQInterface pq = new OtherCustomPQ 当然,这带来了诸如仅能够使用实现的方法之类的困难.它不允许我访问我以后可能想要使用的类的独占方法. 最终,我想要做的是能够使用单个get方法返回任何这些派生类,但仍然保留了普遍使用get方法来调用它们共有的方法的能力,例如execute,创造,结束,同时允许我专门接触他们的独家方法.有办法做到这一点,还是不可能? 如果还不清楚…… 我现在编写的代码是一个基类,以这种方式扩展到其他类… 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继承的所有类;但是,我希望能够访问每个类的独占方法. 解决方法
您可以将对象强制转换为派生类:
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().如果未在CustomAPQ中声明specific1(),则它将不执行任何操作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |