从父类获取子模型



我必须为我的项目创建一个简单的自制ActiveRecord类。

只是遇到了一个问题,即我的Player类中有一个getModel(),它正在由ActiveRecord类扩展。

当我想使用ActiveRecord类中的getModel()方法时,我无法使用它,因为它不是同一类型。我不想在这里引用Player,因为我想使用多个模型。

有人有解决方案吗?

好的,所以我得到了一些东西:

abstract class ActiveRecord<T> {
   private T model;
   public T getModel() {
     return this.model;
   }
}
public class Player extends ActiveRecord<Player> {
}
public class Event extends ActiveRecord<Event> {
}

但是当我尝试在ActiveRecord类中输出this.model时,它会返回null。这里怎么了?

您的方法定义需要执行类似的操作

public Class<? extends ActiveRecord> getModel();

这意味着返回类型是扩展ActiveRecord的类。当您对子项执行此操作时,它将返回Player.class,因为Player扩展了ActiveRecord。

简要说明一下,如果getModel返回该类的对象,那么您应该从方法函数中删除class

public <? extends ActiveRecord> getModel();

所以,如果我理解得很好,你有一个名为ActiveRecord的超级类和一个子类Player,它有一个方法getModel。

如果你想使用ActiveRecord作为引用类型,那么如果你想访问该方法,你也需要在该类中有一个getModel方法。如果您永远不会实例化这样的ActiveRecord,那么您可以使其抽象并定义getModel方法抽象。如果ActiveRecord中没有任何实现逻辑,那么也可以将其作为一个接口。

public abstract class ActiveRecord {
  public abstract Model getModel();
}
public class Player extends ActiveRecord {
  @Override
  public Model getModel() {
    ...
  }
}

你让自己的生活太艰难了。Java已经为您进行了反思。

class Parent {
    // class content
}
class ChildA extends Parent {
    // class content
}
class ChildB extends Parent {
    // class content
}
Parent firstInstance = new ChildA();
Parent secondInstance = new ChildB();
Class typeOfFirst = firstInstance.getClass();
Class typeOfSecond = secondInstance.getClass();

至于null指针错误,在Java中(例如与c++不同),您必须用new显式初始化每个变量。仅仅拥有private T model;并不能创建它的实例。

相关内容

  • 没有找到相关文章

最新更新