簡體   English   中英

隱式調用所有繼承類的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM