为了账号安全,请及时绑定邮箱和手机立即绑定

抽象超类中静态变量的替代方案

抽象超类中静态变量的替代方案

aluckdog 2023-07-28 16:49:35
我试图拥有一个Race由我的蚂蚁实现为通用的抽象超类,以便我可以访问蚂蚁的“移动速度”等属性。对于不同的种族,我将创建扩展类Race,显然我想赋予每个Race不同的属性。“移动速度”需要以Race某种方式保持静态,这样我就可以通过类而不是对象的实例来访问它们,但它不能是静态的,因为这样对于所有种族来说都是相同的。我需要一种方法来规避这个问题,因为我的整个程序结构都依赖于它。我不能Race成为 的超类,Ant因为我有Ant类似Drone或 的子类Queen,并且它们应该可供所有种族访问。public abstract class Race {    public static double speed;}public class defaultAnt extends Race {    public static double speed = 2;}public abstract class Ant<R extends Race> {    public void move(){           speed = R.speed;    }}当我这样尝试时,对于所有种族来说都是一样的,尽管不应该如此。
查看完整描述

1 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

“移动速度”在比赛中需要以某种方式保持静态,这样我就可以按班级访问它们


一点也不。被认为static是良好的 OOP 设计中的异常,尤其是在 Java 中。OOP 的方式是这样的:


public abstract class Race {

  protected abstract double getIndividualSpeed();

...

然后子类(在正确的位置)@Override 提供个人速度。


但正如所说:这里的关键是你退后一步,重新思考你的设计。使用静态字段,尤其是在“多态”上下文中(几乎)是不行的。


除此之外,关于泛型的想法在这里不太适合。泛型(或多或少)是关于“包含”某些东西。当您说class Foo<T extends Bar>then 时,您表示 Foo 实例将以某种方式拥有/与 Bar 类相关。是的,是的,在某种程度上适合您的用例,但是(就我个人而言),我不确定泛型是否是正确的选择。


事实是:泛型主要是编译时的事情。在运行时, 的概念R消失了。你的班级Ant不知道你是否有


Ant<Drone> ant = new Ant...

或者


Ant<Queen> a2 = ...

换句话说:在R.speed概念上是不可能的。更加 OOP 的方法可能如下所示:


public abstract class BaseAnt<R extends Race> {

   protected final R rInstance;

   protected BaseAnt(R rInstance) { this.R rInstance = R rInstance; }


   public final double move(double distance) {

      return distance / Instance.getSpeed();

   }


public class Ant<R extends Race> {

  ctor that calls super constructor

进而


public enum Race {

  DRONE(5), QUEEN(1);


  private final double speed;

  private Race(double speed) { this.speed = speed; }


  public double getSpeed() { return speed; }

换句话说:您可以使用充当“常量提供者”的枚举。您可以在 Race.DRONE 上调用getSpeed();然后你就回来了5。


然后您可以使用 Race.DRONE 或 Race.QUEEN 实例化 Ant。


另一方面,BaseAnt 类为 Ant 执行所有“常见”操作,然后您的子类添加特定的行为。


查看完整回答
反对 回复 2023-07-28
  • 1 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信