簡體   English   中英

Android多態性:反模式?

[英]Android Polymorphism: Anti-Pattern?

我正在閱讀O'Reilly的“ Programming Android”(編程Android)一書,並試圖從第99頁開始圍繞“ Overrides and Callbacks”(重寫和回調)部分。他們使用它作為良好代碼的示例:

public class MyModel {
    public MyModel(TextView textBox) {
        textBox.addTextChangedListener(
            new TextWatcher() {
                public void afterTextChanged(Editable s) {
                    handleTextChange(s);
                }
                // ...
    }
    void handleTextChange(Editable s) {
        // do something with s, the changed text.
    }
}

由於缺乏 可擴展性 封裝,后來將其稱為反模式:

public class MyModel implements TextWatcher {
    public MyModel(TextView textBox) {
        textBox.addTextChangedListener(this);
    }

    public void afterTextChanged(Editable s) {
        handleTextChange(s);
    }

    // ...

    void handleTextChange(Editable s) {
        // do something with s, the changed text.
    }
}

除了第二個更具可讀性之外,我看不到兩者之間的功能差異。 兩者都采用TextView,並實現了處理程序函數來覆蓋。 用這樣的東西擴展第二個內容不是很容易嗎?

public class AnotherModel extends MyModel {
    @Override
    void handleTextChange(Editable s) {
         // another implementation
    }
}

由於缺乏可擴展性而導致的反模式

在擴展性方面,它們是相似的,因為這兩種方法都可以讓子類通過覆蓋handleTextChange輕松地修改現有的TextChangeListener 但是它們的不同之處在於,唯一的方法#2還使子類可以輕松添加新的 TextChangeListener而不修改現有(繼承)的TextChangeListener

即使超類使用方法1,子類仍然可以使用方法2添加新的TextChangeListener 但是,如果我們要討論的是一般使用的模式,那么與方法1的一致使用相比,方法2的一致使用將提供更多的可擴展性。

我不喜歡第二種形式,因為該類將接口實現為一種技巧,而不是因為該類自然是該接口的子類型。

第二種形式在簡單情況下是可以管理的,因此除非雜亂無章,否則還可以。

在Java 8中,我們可以以更好的語法使用第一種形式:

    textBox.addTextChangedListener(this#handleTextChange);  // method reference

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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