0

我有一些基类Entity。我想允许用户Entity创建Entity扩展某些给定超类 T 的实例(好像Entitys 声明是Class Entity extends T)。我不知道 T 实际上是什么,所以我想Entity在这方面是模块化的。如果那不可能,我也可以Entity实现给定的接口 T 。

喜欢public class Entity<T> extends Tpublic class Entity<T> implements T不工作的事情。(“不能将类型参数 T 称为超类型”)。

所以我的问题是:

1)这完全有可能在java中实现吗?其他语言?

2)如果是这样,怎么办?

3)通常当java设置这样的障碍时,这意味着我的设计有问题,那么你将如何创建这个功能(我想我正在寻找的基本上是来自Entity和T的多重继承,可以这样做吗?) .

编辑:澄清 - 我想实现mixin类型的行为,同时尽可能少地要求调用者(创建 T 的子类,它将调用委托给 Entity 实例将需要调用者太多)。没有其他方法可以做到这一点吗?

4

4 回答 4

2

Java 不支持多重继承;给定的类不能是多个类的直接子

但是,如果Entityinterface,您可以使用intersection bound来实现。

例如,要编写一个方法,该方法接受一个实例,该实例是 的子类(不一定是直接子类)SomeClass并实现Entity

public <T extends Entity & SomeClass> void doSomething(T t) {
}
于 2013-01-04T09:45:35.550 回答
0
template <class A>
class B : public A
{

至少在 C++ 中是可能的。

我在自己的工作中使用过一次,将行为添加到两个非常密切相关的类(一个继承自另一个)。直到很久以后,我才意识到装饰器模式可能也有效。或许你也可以考虑一下。

于 2013-01-04T09:32:12.767 回答
0

不,这不是它在 Java 中的工作方式。您可能需要考虑组合而不是继承。

我有点在字里行间阅读,但是这些实体在游戏引擎中吗?一个组件系统会很好地工作......

http://gameprogrammingpatterns.com/component.html

这是一个简单的例子......

class Entity {
    List<Component> components;

    void update() {
        for(Component component: components) {
            component.update(this);
        }
    }
}

interface Component {
    void update(Entity parent);
}

class MovementComponent implements Component ...
class AnimationComponent ...
class BehaviourComponent ...
于 2013-01-04T09:37:18.280 回答
0

您问题的关键是当您说要“创建扩展某些给定超类 T 的实体实例”时。对象(类的实例)从不扩展类。只有类扩展其他类。

您可能想要的是使用接口。让 Entity 成为一个接口并创建实现 Entity 的类,然后实例化这些类。

于 2013-01-04T09:48:10.633 回答