[英]Implicitly call method on all inherited classes
在所有繼承的類上調用方法的最佳java編程實踐是什么。 考慮這個偽代碼:
class TopLevel extends (SecondLevel extends Base)
如果所有這些類都有方法'serializeToString',那么如何在整個繼承結構中調用此方法? 這個要求的原因是每個類都有自己需要序列化的變量。
此外,還有一個要求:
每個類“頂層”和“第二級別” 不 asbstract,並且將需要序列化的全部遺產的入口點。
例如,
SecondLevel.serializeToString()
將需要在'Base'上調用該方法
和:
TopLevel.serializeToString()
需要在'SecondLevel'和'Base'上調用該方法。
目前,我在base中有serializeToString方法,然后在整個繼承上調用方法'addSerialization'(並且每個實現必須調用super來傳播調用)
雖然這有效,但在我的代碼中看起來有點麻煩,有兩種方法可以實現一個(簡單?)的事情。
實現這一目標的最佳方法是什么?
在調用super
的繼承結構中,每個類中的相同override方法將為您提供一個對基類的調用,每個調用超類覆蓋方法。
如果您不需要傳遞額外的參數並且返回類型與您的邏輯兼容,則可以在每個類中調用super.serializeToString()
來調用超類實現。
class TopLevel {
@Override public String serializeToString() {
return super.serializeToString() // calls SecondLevel implementation
+ ", topLevelAttribute: 1";
}
}
class SecondLevel {
@Override public String serializeToString() {
return super.serializeToString() // calls Base implementation
+ ", secondLevelAttribute: 2";
}
}
// and so on ...
現在,如果上面的解決方案不適合您的邏輯,則無法避免創建從超類調用的另一個方法。
class Base {
public String serializeToString() {
StringBuilder sb = new StringBuilder();
appendSerializedTo(sb);
return sb.toString();
}
// can be abstract if there's no implementation here
protected void appendSerializedTo(StringBuilder sb) {
sb.append("baseAttribute: 3");
}
}
class SecondLevel {
@Override protected void appendSerializedTo(StringBuilder sb) {
super.appendSerializedTo(sb); // calls Base implementation
sb.append("secondLevelAttribute: 2");
}
}
// and so on...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.