繁体   English   中英

如何使用Java中的接口从超类实现抽象函数

[英]How to implement an abstract function from a super class with an interface in java

所以我有一堂课,看起来像这样:

public abstract class GameObject {

    public abstract boolean hasValidLocation();

    //some more code that will use hasValidLocation
}

和一个接口:

public interface Collidable {

    //some abstract references to functions of the game object

    default boolean hasValidLocation() {
        //checks whether or not the the game object has  a valid locaton
    }
}

并且我有一个类似的NotCollidable接口,并希望通过该接口实现游戏对象的抽象功能hasValidLocation

public class GameObject1 extends GameObject implements Collidable {
    //some code
}

但Java说, GameObject1没有实现hasValidLocation 我不能用2抽象类,因为我已经拆分gameObjectDynamicGameObjectStaticGameObject和这些都可以是可碰撞,而不是可碰撞。

是否有我做错的事情或不需要我多次编写hasValidLocation()的替代解决方案?

我错过了部分问题。

也许您的基础抽象类应该实现CollidableNotCollidable通用的超级接口:

例如:

interface LocationValidatable {
    default boolean hasValidLocation() {
      return false;
    }
}

interface Collidable extends LocationValidatable {
    default boolean hasValidLocation() {
      return true; // replace with actual logic
    }
}

interface NotCollidable extends LocationValidatable {
    default boolean hasValidLocation() {
      return false; // replace with actual logic
    }
}

abstract class GameObject implements LocationValidatable {
    //some more code that will use hasValidLocation
}

现在,每个具体的子类都可以选择实现Collidable还是NotCollidable

class GameObject1 extends GameObject implements Collidable {
    //some code
}

class GameObject2 extends GameObject implements NotCollidable {
    //some code
}

为什么不做一些完全不同的事情? 每当你使用hasValidLocation方法你可以检查GameObject实际实现的Collidable接口。

这是GameObject类的代码:

public class GameObject
{
    // The GameObject actually does not contain a hasValidLocation() method.
}

这是Collidable接口的代码。

public interface Collidable
{
     // The Collidable interface actually contains the hasValidLocation() method.
     public abstract boolean hasValidLocation();
}

这里只是一个简单的例子,你如何能够确定gameObject实现了Collidable的接口。

if (gameObject instanceof Collidable)
{
    final boolean isValid = ((Collidable) gameObject).hasValidLocation();
}

default方法不是abstract因此您不必重写它。

因此,您只需要重写GameObject类中的抽象方法。

所以当你这样覆盖

@Override
   public boolean hasValidLocation()
   {
      // TODO Auto-generated method stub
      return false;
   }

这是GameObject界面中的替代方法

您只需更改hasValidLocation方法之一的名称即可解决此问题。

例如

public interface Collidable {


    default boolean calculateLocationValidity() {
        return true;    
    }

}

和:

public class GameObject1 extends GameObject implements Collidable {

    public boolean hasValidLocation() {
        return calculateLocationValidity();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM