扩展参数类/接口的java基类

时间:2013-01-04 09:30:15

标签: java multiple-inheritance

我有一些基类Entity。我想允许Entity的用户创建Entity的实例,这些实例扩展了某些给定的超类T(就好像Entity的声明是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 个答案:

答案 0 :(得分:2)

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

但是,如果Entity接口,则可以使用交叉点绑定来执行此操作。

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

public <T extends Entity & SomeClass> void doSomething(T t) {
}

答案 1 :(得分:0)

template <class A>
class B : public A
{

至少可以在C ++中使用。

我在自己的工作中使用了一次,将行为添加到两个非常密切相关的类(一个继承自另一个)。很久以后,Decorator Pattern可能也起作用,这让我很震惊。也许你也可以考虑一下。

答案 2 :(得分: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 ...

答案 3 :(得分:0)

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

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