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