我有一些基类Entity
。我想允许Entity
的用户创建Entity
的实例,这些实例扩展了某些给定的超类T(就好像Entity
的声明是Class Entity extends T
)。我不知道T究竟是什么,所以我希望Entity
在这方面是模块化的。如果那是不可能的,我也可以Entity
实现给定的接口T.
public class Entity<T> extends T
和public class Entity<T> implements T
之类的内容不起作用。 (“不能将类型参数T称为超类型”)。
所以我的问题是:
1)这有可能在java中实现吗?其他一些语言?
2)如果是这样,怎么样?
3)通常当java提出这样的障碍时,这意味着我的设计出了问题,那么你将如何创建这个功能(我想我正在寻找的基本上是来自Entity和T的多重继承,这可能是完成了?)。
编辑:澄清 - 我希望实现mixin类型行为,同时尽可能少地从调用者(创建T的子类,委托对Entity实例的调用将要求来自调用者的太多)。没有其他办法可以做到这一点吗?
答案 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的类,然后实例化这些类。