很多答案,但我想添加自己的 0.02 美元。
我很少覆盖 concreate 类,但在某些特定情况下。当框架类被设计为可扩展时,至少已经提到了 1 个。通过一些示例,我想到了另外 2 个:
1)如果我想调整具体类的行为。有时我想更改具体类的工作方式,或者我想知道何时调用某个方法以便触发某些事情。通常具体的类会定义一个钩子方法,其唯一用途是让子类覆盖该方法。
示例:我们覆盖MBeanExporter
是因为我们需要能够取消注册 JMX bean:
public class MBeanRegistrationSupport {
// the concrete class has a hook defined
protected void onRegister(ObjectName objectName) {
}
我们班:
public class UnregisterableMBeanExporter extends MBeanExporter {
@Override
protected void onUnregister(ObjectName name) {
// always a good idea
super.onRegister(name);
objectMap.remove(name);
}
这是另一个很好的例子。 LinkedHashMap
旨在removeEldestEntry
覆盖其方法。
private static class LimitedLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
@Override
protected boolean removeEldestEntry(Entry<K, V> eldest) {
return size() > 1000;
}
2) 如果一个类与具体类有大量重叠,除了对功能的一些调整。
示例:我的ORMLite项目处理持久Long
对象字段和long
原始字段。两者的定义几乎相同。 LongObjectType
提供了描述数据库如何处理long
字段的所有方法。
public class LongObjectType {
// a whole bunch of methods
whileLongType
覆盖LongObjectType
并只调整一个方法来处理原语。
public class LongType extends LongObjectType {
...
@Override
public boolean isPrimitive() {
return true;
}
}
希望这可以帮助。