[英]How do you implement a Java Enumeration Abstract class and interface?
[英]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抽象类,因为我已经拆分gameObject
在DynamicGameObject
和StaticGameObject
和这些都可以是可碰撞,而不是可碰撞。
是否有我做错的事情或不需要我多次编写hasValidLocation()
的替代解决方案?
我错过了部分问题。
也许您的基础抽象类应该实现Collidable
和NotCollidable
通用的超级接口:
例如:
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.