【问题标题】:How do I enforce a child class from an abstract class to implement a static method如何强制抽象类中的子类实现静态方法
【发布时间】:2013-08-02 08:56:38
【问题描述】:

我有抽象类 Animal,然后我有像 Dog 和 Cat 这样的类,它们扩展了 Animal 类。

我想确保父类 Animal 的所有子类都有一个静态方法:getProperties。即使其他无法访问我的代码的人实现了一个新的 Animal 子类。

我希望它是静态的,因为 Dog 类的所有 Animals 都具有完全相同的属性(或者您不需要 Dog 来知道 Dog 的一般外观),因此它是一个调用的方法是有道理的类类型,而不是类实例。

这可能吗?

【问题讨论】:

  • static 方法没有被覆盖,它属于一个类。我相信你不能强制执行。所有都没有相同的属性!如果是这样,那么您不需要 Dog 的不同实例!!!
  • 我觉得this answer值得一看。

标签: java


【解决方案1】:

静态方法需要能够在您不显式创建Animal 类的新实例的情况下运行。你必须完全实现Animal.getProperties()

【讨论】:

    【解决方案2】:

    Java Object model 不支持类端继承(与 Smalltalk 或 Ruby 不同)。 你必须明确地实现你的域的元模型,例如,像这样:

    public abstract class AnimalDescriptor<T> { // or <T extends Animal>
    
        public abstract List<String> getProperties();
    
        public abstract T newAnimal();
    
    }
    
    public class DogDescriptor extends AnimalDescriptor<Dog> {
    
        public static final DogDescriptor INSTANCE = new DogDescriptor();
    
        public List<String> getProperties() { ... }
    
        public Dog newAnimal() { return new Dog(); }
    
    }
    
    void doStuff(AnimalDescriptor<?> desc) {
        desc.getProperties();
    }
    
    doStuff(DogDescriptor.INSTANCE);
    

    这只是一个示例,您必须对其进行调整以满足您的需求。例如,您可能想在动物端添加一个getDescriptor() 方法。

    【讨论】:

    • 那么我应该将这些描述符实现为单例吗?
    • 因为这里的实现方式,单例模式看起来真的很“合适”。
    • 取决于您需要描述符中的哪些功能。只要它有效,当然!
    【解决方案3】:

    如果您想让每个 Animal 类提供有关它的元数据,请为其提供实例方法,例如 getPropertiesgetNumberOfLegsgetLocomotionType 等。您可以使用静态常量来实现这些:

    public abstract class Animal {
        public abstract int getNumberOfLegs();
    }
    
    public class Dog {
        private static final NUMBER_OF_LEGS = 4;
        public int getNumberOfLegs() {
            return NUMBER_OF_LEGS;
        }
        // ...
    }
    

    我想你想要 Map 某种形式的 getProperties 方法。这样做的问题是您必须非常小心地使您返回的地图不可变。一个错误,有人可以为每个人更改静态实例。使该方法成为实例方法几乎不会花费您任何费用。

    【讨论】:

      【解决方案4】:

      Java 中的static 表示方法(例如)与类的任何实例都不相关。它对所有实例都是通用的,它的实现只是嵌套在类中。

      当我读到你的问题时,我相信你需要 abstract 类中的 abstract 方法。

      public abstract class Animal {
          public abstract <some-return-type> getProperties();
      }
      

      在这种情况下,每个继承Animal 的类都必须提供getProperties 方法的实现(在这种情况下不是 static)。

      如果您希望它是静态的,只需将其设为静态(在 Animal 类中),然后您将拥有 singleshared 实现。

      【讨论】:

      • 但是这个单一和共享的实现永远不可能是完整的,因为您无法提前知道新动物有哪些属性。并且制作一个非静态抽象的方法,有点强制你在知道它的属性之前有一个 Dog...
      • “属性”是指非静态成员?
      • 属性是指静态成员,因为它们对于类的所有实例都是相同的
      • 那么你可以使用Reflection
      【解决方案5】:

      不,不可能。在静态上下文中没有继承。不,没有办法强制类实现静态方法。

      【讨论】:

        【解决方案6】:

        这在 Java 中是不可能的,你可以“隐藏”一个静态方法,但不能“覆盖”它。

        【讨论】:

          猜你喜欢
          • 2012-11-14
          • 1970-01-01
          • 2021-01-10
          • 1970-01-01
          • 2015-06-09
          • 2010-10-23
          • 2011-03-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多