2012-07-25 83 views
0

Java - 我有一個抽象基類,我想從子類設置基類的幾個屬性。什麼是最好的方式來做到這一點?使屬性保護?在基類中創建setter?Java - 我有一個抽象基類,我想從子類設置基類的幾個屬性

public abstract class A { 
protected String tag; 
protected String apiUrl; 
    // Setter 
    public void setApiUri(String url) { 
     this.apiUrl = url; 
    } 
} 

public class B extends A { 
    tag = "Class B"; 
    apiUrl = "Class B Prefs"; 
} 

public class C extends A { 
    tag = "Class C"; 
    apiUrl = "Class C Prefs"; 
} 

請讓我知道什麼是最好的方法/任何更好的做法。

+0

在基類本身中創建get/set。需要時從子類中調用它們。抽象類包含已實現的方法。例如,公共類C擴展A {){setTag(「Class C」);}。 } – kosa 2012-07-25 18:36:54

回答

3

如果您想要最大化封裝,請將基類字段設置爲private,並提供受保護的訪問器。這通常是最佳做法。

如果你對最大封裝不感興趣,可以使字段保護,但它將類連接在一起比繼承固有的更緊密。

一般來說,您最好的選擇是上面的第一個選項。 JVM的JIT可以優化呼叫,並且它有助於保持鬆散耦合的某些

0

這取決於具體情況,但通常情況下,您希望從派生中保留基類的狀態,並完全控制它如何實例化自己的成員。實現這一點的最好方法是通過爲基類指定一個構造函數來輸入和初始化其成員,並從具體的類中調用它。下面是一個例子:

abstract class Base{ 
    String s; 
    int i; 

    public Base(String s, int i){ 
     this.s = s; // Only base knows best how the initialization should be done 
     this.i = i; 
    } 
} 

class Concrete extends Base{ 

    // the role of the inheritor is to pass on the building blocks of its Base to Bases 
    //constructor 
    public Concrete(String s, int i) { 
     super(s, i); 
    } 

}