当前位置: 首页 > 知识库问答 >
问题:

我如何从一个抽象类强制一个子类来实现一个静态方法

朱欣荣
2023-03-14

我有抽象类动物,然后我有像狗和猫这样的类,并且扩展了类动物。

我想确保父类动物的所有子类都有一个静态方法:getProperties。即使其他人无权访问我的代码,也可以实现一个新的动物子类。

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

这可能吗?

共有3个答案

葛安和
2023-03-14

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

乐正烨熠
2023-03-14

Java对象模型不支持类端继承(与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);

这只是一个例子,你必须适应它来满足你的需要。例如,您可能希望在动物端添加一个< code>getDescriptor()方法。

隆康平
2023-03-14

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

当我读到你的问题时,我相信你需要一个抽象的方法在动物类。

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

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

如果您希望它是静态的,就让它成为静态的(在< code>Animal类中),但是这样您将有一个单独的共享实现。

 类似资料:
  • 我使用架构和堆栈。 对于服务之间的通信,我决定使用。 我有一个名为的服务,今天我实现了一个项目,并将其添加到存储库中。 我添加了到服务使用使用以下命令: 现在我想在中创建一个服务类,

  • 问题内容: 抽象类是否必须至少具有一个抽象方法? 问题答案: 这篇文章的主题和正文提出了两个不同的问题: 它应该至少有一个抽象成员吗? 是否需要至少一个抽象成员? #2的答案肯定是“否”。 #1的答案是主观的,是风格的问题。我个人会说是的。如果您的目的是防止实例化一个类(没有抽象方法),那么最好的方法是使用构造函数,而不是对其进行标记。

  • 我有一个关于接口的问题,比如: 现在,我需要这只猫去抓一只老鼠void catchMouse(){std::cout 有几种可能的解决方案,但看起来都不好。 > 在IAnim中添加一个方法,然后使用AnimalFactory创建猫后,我可以从IAnimal调用catchMouse()方法。但是catchMouse并不适用于所有动物,狗不catchMouse。将方法添加到IEM会污染界面,嗅到代码。

  • 问题内容: 我最近从使用PHP切换到Java,并进行了查询。想强调一下我是Java的初学者。 本质上,我正在使用文件A(具有类A),并且想要引用保存在文件B(类B)中的静态方法。使用A类时是否需要参考文件B?(我正在考虑使用PHP中的require_once)我在A类中的代码如下: Eclipse无法将B识别为类。我是否需要创建B的实例才能访问静态方法。觉得我真的忽略了某些东西,希望您能提出任何建

  • 我创建了两个类:和。下面是进行计算的方法: 这里是一个调用并显示结果的函数,不幸的是,我无法根据这本书要求它运行的方式来运行它。 任何提示都会帮助我在我的再教育过程中。