【问题标题】:java base class that extends a paramater class/interface扩展参数类/接口的java基类
【发布时间】:2013-01-04 09:30:14
【问题描述】:

我有一些基类Entity。我想允许Entity 的用户创建扩展某些给定超类T 的Entity 实例(好像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 实例将需要调用者太多)。有没有其他方法可以做到这一点?

【问题讨论】:

  • 是的,这在 Java 中没有意义。一个类扩展一个任意类意味着什么?您在寻找 mixin 类型的行为吗?
  • 在问题 1 中,您为什么要问“[这可能在] 其他语言中吗?”。这不是真的要成为Java 的问题吗?
  • 我会尝试将您要注入的任何超类所需的最少属性和方法的接口组合在一起,然后让Entity 实现给定的接口。如果您需要比这更复杂的东西,那么您可能需要建立某种工厂。
  • @JackManey 我不是在建立工厂,只是不确定如何去做。我不能要求对超类进行更改,也不能提前知道它们。我只想能够创建一个超类的实例,它也具有我的具体Entitys 功能。
  • @OliCharlesworth 是的,我想实现 mixin 类型的行为,同时尽可能少地要求调用者(创建一个 T 的子类,它将调用委托给 Entity 实例将需要调用者太多)。有没有其他方法可以做到这一点?

标签: java multiple-inheritance


【解决方案1】:

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

但是,如果Entity 是一个接口,您可以使用交叉限制

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

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

【讨论】:

  • 但实体不是也不能是接口。它具有我希望附加到其他任意类的具体功能..
  • 组合和注释处理可能是你的最佳选择
  • 啊。注释处理似乎很有希望。我会试一试。谢谢。
【解决方案2】:
template <class A>
class B : public A
{

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

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

【讨论】:

  • 我的猜测(我没有对你投反对票)是你只回答了问题 1 的一小部分——而且那部分并不是特别有用。
  • @GregKopff:很公平.. 但它至少是部分答案,绝不是错误的.. 在我的书中不值得反对。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    不,这不是它在 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 ...
    

    【讨论】:

    • +1 用于在行间阅读。但它实际上是应该补充现有游戏引擎的库的一部分。现有的游戏引擎通常有一些自己的具体Entity 类。我想让图书馆的用户创建他们的游戏引擎entitys 的实例,这些实例也具有我的Entity 类的功能..
    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 2012-09-01
    • 2013-05-20
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 2017-12-07
    • 2012-07-24
    相关资源
    最近更新 更多