我有一个将被子类化的类。所有子类必须包含具有相同签名的静态方法,但每个子类都不同。
我想在超类中有一个抽象的实例方法,子类会覆盖它,但在Java中似乎有可能,我想知道为什么。
一个愚蠢的例子:
图像{ abstract String getExtension(); ...
RGBImage扩展图片{ static String getExtension(){return“RGB”}; ..
PNGImage扩展图片{ static String getExtension(){return“PNG”}; ...
答案 0 :(得分:1)
看看这个explanation。您可以使用Builder模式。
答案 1 :(得分:1)
正如其他人所说,Java不支持覆盖或abstract
静态方法。但是,我真的不明白你用“抽象”静态方法会达到什么目的。
抽象方法的正常用法是强制每个子类实现具有相同签名的方法。但为什么静态(因此是非多态的)方法甚至是否重要?如果你忘了为其中一个子类提供方法,那么它并不重要,因为你没有调用它,或者它确实很重要但你会在尝试调用缺少的方法时得到一个编译错误。
我能想到的唯一用例是,如果你以伪多态的方式反复调用该方法。但是如果你这样做,你最好使用真正的多态和实例方法。
答案 2 :(得分:0)
我没有做太多的Java,但是(使用C ++逻辑)你可以使基类实现成为一个无法执行的虚拟实现。
static void DoStuff(arg_type arg)
{
std::cerr << "Method DoStuff() must be overriden\n";
::abort();
}
这不如抽象方法好,但它会实现一些相同的结果。
答案 3 :(得分:0)
不幸的是,这在Java中是不可能的。你必须使它们成为实例方法才能定义为抽象。
答案 4 :(得分:0)
您想要使用静态方法覆盖实例方法吗?这是没有意义的。静态方法不是多态的。你想怎么称呼它?在Java中,不可能强制类使用具有给定签名的静态方法。
答案 5 :(得分:0)
不可能覆盖静态方法,因为它们属于类,而不是实例。
此外,如您在示例中所建议的那样,实例方法不能在子类中变为静态。
您是否可以提供有关为什么所有子类都需要具有相同静态方法的更多信息?
答案 6 :(得分:0)
我想在超类中声明抽象方法的原因是因为类必须使用抽象方法的结果做一些额外的工作。
让我们简单一点,即使这个例子没有意义:
Image{
abstract String getExtension();
int process(){
return getExtension().length
}
process()
中的算法对于XXXImage
的所有子类Image
都是通用的,所以它的正确位置是超类。
让我说,一切正常,可以在每个子类中实现实例getExtension()
方法。但重点是该方法实际上是子类中的静态,不依赖于实例。
我知道我不能这样做,我只是说对我来说似乎没有那么奇怪的想法。
答案 7 :(得分:0)
正如其他人所说,静态不是多态的......它意味着它对于类来说是相同的,而不是特定于实例。我不确定使用静态方法可以实现什么...但是你可以让你的扩展方法实现返回一个静态值:
public String getExtension() {
return STATIC_CONSTANT;
}
我想这取决于您尝试使用静态方法完成的任务。从你的帖子:“让我说,一切正常,可以在每个子类中实现一个实例getExtension()方法。但重点是该方法实际上是子类中的静态,不依赖于实例。我知道我可以'这样做,我只是说对我来说似乎没有那么奇怪的想法。“
问题是你要求为定义类的行为而不是实例的行为的多态行为(每个子类的方法行为的变化)。根据定义,静态不能是多态的。我希望这可以帮助您理解为什么这是不可能的。
答案 8 :(得分:-2)
是的,这就是我正在做的事情,重新调整静态constat。在可能的情况下,它返回内部枚举的类对象,列出给定文件格式的节的名称:子类的文件格式。
但是你在你的例子中说得很清楚:
public String getExtension(){
返回STATIC_CONSTANT;
}
我原本希望能在String ...之前放置“static”。