在Android Studio中模拟默认(“Defender”)方法

时间:2016-03-16 03:31:13

标签: java android inheritance

Android Studio不支持Java 8默认方法。 是否有可能通过不同的方式实现其功能?

我已经在Java IDE中使用了代码。我正在尝试将以下功能移植到Android Studio。

(在基于刻度的动画循环的上下文中。)

简化,相关架构围绕四件事:

  1. 具有实例变量的getter的“纯”接口(Common
  2. 一个抽象类(anObject),使用Common方法扩展updateMe()并实现其所有getter,定义为调用一系列抽象方法。
  3. 扩展Common的其他接口,其中每个接口都描述了一个属性,该属性会影响anObject在执行其抽象方法时的反应。
  4. 扩展anObject并实现许多属性接口的具体类。
  5. 动画循环在每个滴答的每个对象实例上调用updateMe(...),这在anObject中作为方法实现,然后调用anObject抽象方法(为了问题,只有moveMe()drawMe(...))。

    现在创建要与之交互的复合对象变得非常简单:

    Ball extends anObject implements isRound, isMobile
    

    接口isRounddrawMe(..)提供了一个默认实现,它使用Common中的getter(在anObject中实现)来获取对象的实例变量,然后执行{{ 1}}命令。

    同样,drawOval(...)实现了从isMobile继承的moveMe()的抽象Ball

    过度简化,但确实如此。它使多个对象的管理行为变得简单化。我的完整代码包含冲突检查,播放器输入等。只需添加少量代码,默认方法即可添加全新的游戏和功能。最初的Pong任务现在有能力成为Snake,PacMan,添加多个球等等。它似乎是一个非常强大的资源。

    那么,如果我不能使用默认方法,如何将这些'属性'接口的功能转换为android?它基本上允许多重和非线性继承。

    在写完之后,我发现每次我想要一个界面向下填充它时我都可以复制/粘贴相关的方法,但这是相当混乱的,并且有可能进行更改和版本化生活的噩梦。我还是想看看是否有人有更好的解决方案。

2 个答案:

答案 0 :(得分:0)

我的解决方法:

每个方法都在anObject中具体实现,moveMe()drawMe()除外,它们都是抽象的。

class anObject {
...
void isRound() {
    //drawOval, etc goes here
}

void isSquare() {
    //drawRect, etc goes here 
}

abstract void drawMe()

class Ball extends anObject { 
... 
void drawMe() { this.isRound(); }

适用于我的目的,因为一切都已经延伸anObject,但在不是真的情况下不会有用。

答案 1 :(得分:0)

最接近模仿原始代码的方法是通过反射。使用几个枚举关键字标记对象类;然后,在构造函数(或主活动中的某个位置)调用一个帮助器方法,该方法实现枚举引用的方法。