繁体   English   中英

在继承的类上重写类变量/方法

[英]Override class variable/method on inherited classes

我已经定义了一个类,并且希望有一个类方法(或变量,我不在乎),每个继承的类都需要重写该方法。 我最好的方法是不成功的:

public abstract String getHumanString(); ,因为抽象方法不能是静态的

public static String getHumanString(); ,因为静态方法只能被隐藏,不能被覆盖。

我不知道我是否可以使用其他技巧。 我也可以高兴地自动在父类上通过诸如getHumanString() class.getClass().getName() )之类的方法自动定义getHumanString() getName()根据我的需要,我会让getName()看起来更漂亮) , getName()在静态方法上不可访问。 因此,总而言之,我的问题是:

1.我可以有一个可以在子类上进行编辑的静态方法/变量吗?

或者,作为另一个有效的解决方案:

2.我可以创建一个使用自己的类名播放的静态方法吗?

提前致谢。

编辑:

想象一下这种情况(我将在此处直接编写代码,所以我将跳过无用的行):

class ParentClass {
    public static (or whatever) String getHumanString() {
        return "My Parent Class";
    }

    public static showMyInfo() {
        System.out.println(getHumanString());
    }
}

class ChildClass {
    @Override
    public static (or whatever) String getHumanString() {
        return "My Child Class";
    }
}

...

public static void main()
{
   ChildClass.showMyInfo();
}

它应该输出(如我所愿)“我的孩子班”,但实际上却输出(众所周知)“我的父母班”。

静态方法不是多态的,不是。 顺便说一句,变量也不是-您不能覆盖变量,甚至不能覆盖实例变量。 您可以隐藏它们,但不能覆盖它们。

坦白说,您实际上并不清楚要做什么,但是您可能需要考虑一个对应的类型层次结构,以便静态方法成为新类型中的实例方法。

我希望每个类都有一个可读的名称(不仅仅是getClass()。getName()),它不依赖于对象实例。 实际上,当我需要getHumanString()时,我想避免实例化该类。

有一个属性文件,其类名为键,人为字符串为值。 还有一个静态方法可以在某处读取它。

 static String getHumanString(Class<?> clazz){
     return humanStrings.getProperty(clazz.getName(), clazz.getSimpleName());
 }

必要时还可以进行本地化。 另外,您可以“增强”您无法更改其定义的现有类。

如果有此要求,我建议将static成员和字段拆分为自己的类。 这样,您现有的类可以引用一个多态类的单个static实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM