2015-11-14 80 views
0

如何訪問其父類中聲明的子類的字符串變量?如何從父母的方法訪問孩子的繼承成員

我上課的類似:

public class Parent { 
    public void display() { 
    // displays A 
    } 
} 

public class Child1 extends Parent { 
} 

public class Child2 extends Parent { 
} 

Parent p1 = new Child1(); 
Parent p2 = new Child2(); 

p1.display(); // Currently displaying parent value of A 
p2.display(); // Currently displaying parent value of A 

如何保證這裏面display(),既p1p2使用自己的值A,而不是父類?因爲你不使用靜態成員

期望的行爲是正常行爲,所以長;

+2

如果'Parent'類不是抽象的,使其具有參數的構造'(字符串一)'。然後從子類調用'super(A)' –

+3

你能重寫你的問題嗎,因爲我不明白你的意思是什麼 –

+0

我試過編輯這個問題。對不起,這是一個完整的重寫,但原來很難理解。如果我的棍棒結尾錯誤,請將編輯拖回(或更新我的編輯)。 –

回答

0

(道歉,如果我誤解了這個問題,我回答這個問題,因爲我已經編輯它。) 。在超類中定義所需的成員爲protected;這三個類中的任何一個的每個實例都將使用它自己的值。

public class Parent { 
    protected string name; 

    public Parent() { 
    name = "Parent's value"; 
    } 

    public void setName(string newValue) { 
    name = newValue; 
    } 

    public void display() { 
    System.out.println(name); 
    } 
} 

public class Child1 extends Parent { 
    public Child1() { 
    name = "Child1's value"; 
    } 
} 

public class Child2 extends Parent { 
    public Child2() { 
    name = "Child2's value"; 
    } 
} 

public static void main() { 
    new Parent().display(); 
    new Child1().display(); 
    Child2 c2 = new Child2(); 
    c2.display(); 
    c2.setName("New name!"); 
    c2.display(); 
} 

這產生了預期的輸出:

Parent's value 
Child1's value 
Child2's value 
New name! 
+0

如果變量構造的一部分,它會強制子類時,他們實例始終使用一個不同的變量;你認爲這種限制的靈活性;我想知道你對在父項中使用getName()方法的意見,並覆蓋它,如上面在我的回覆中所述。 – smc

+0

在父項中使用'getName()'就好了。但是,對'name'成員進行多次聲明或對'getName()'方法進行多個定義是沒有意義的。它們都可以在Parent中完成。這個子類不需要任何特殊的代碼。 –

+0

「如果變量構造的一部分,它會強制子類時,他們實例始終使用一個不同的變量」。這是不正確的,它不強制執行任何操作。你可能有一個'setName()'方法或者直接簡單地使用這個屬性。在我的示例代碼中,'Child1'和'Child2'直接更新'name'屬性。你不需要一個不同的變量。 –

0

替代地,如果有是得到A的值,像getA()class Parent,覆蓋的方法在每個class Child1class Child2的返回的方法他們各自的A值。

我通過@保羅 - 希克斯重用例子,演示-ED我下面的方法:

public class Parent 
    ... 
    public void display() { 
     System.out.println(getA()); 
    } 

    protected String getName() { 
     return "parent"; 
    } 
} 

class Child1 { 
    ... 
    protected String getName() { 
     return "child1"; 
    } 
} 

class Child2 { 
    ... 
    protected String getName() { 
     return "child2"; 
    } 
} 
+0

此版本不使用任何字段/成員,只是常量。這非常不靈活。如果'getName()'實際上會返回'name'成員,那麼它和我的答案一樣。我只是爲了示例的目的而使用了一個快捷方式:我使用了受保護的成員而不是訪問者。相識又有差別。 –

+0

@PaulHicks當你指出我的版本不使用字段/成員時,我意識到我離題了。你已經寫了一個示例代碼來問問這個問題的人的利益,並且我對這個問題的設計方面進行了分析。是的,它是一樣的。 – smc

1

有做這一個很常見的方式。這是一個java'模式'。這種技術是在面向對象設計中使用getter/setter方法的一個驅動示例。

聲明父級中值A的抽象getter/setter方法在子類中完全定義它們。父母通常使用getter/setter來訪問該值。

通過這種方式,父級和子級將始終使用'A'值作爲子類中的聲明,管理和更新。吸氣劑和吸附劑不能是靜態的(當然,這是沒有意義的)。此方法允許父級和子級保持獨立,並且可以以非常靈活和乾淨的方式修改/調整孩子。特別是,子類不需要主動維護A,並且可以通過JIT(即時)方式計算,重複檢查或委託A的請求。

完整的例子:

public abstract class Parent { 
    // These two methods must be overridden by all child classes. Compiler enforces that. 
    public abstract int getA(); 
    public abstract int setA(int newA); 
     // This display routine utilizes the *childs* a 
    public void display() { someoutput.write(this.getA()); } 
} 

public class Child1 extends Parent { 
    SomeFancyOrPartularFormOfA a = null; // a Jazzy type of A, used by parent. 
    @Override // Let java and IDEs know we intend to override it. 
    public int getA() { return(this.a.gatherorcalcA()); } 
    @Override // Let java and IDEs know we intend to override it. 
    public int setA(int newA) { this.a.setorincorporateA(newA); } 
    . . . 
} 
public class Child2 extends Parent { 
    Integer a = 0; // A more mundane type of A, still used by parent. 
    @Override // Let java and IDEs know we intend to override it. 
    public int getA() { return(this.a); } 
    @Override // Let java and IDEs know we intend to override it. 
    public int setA(int newA) { this.a = newA; } 
    . . . 
} 
+0

好萊塢原理/模板方法模式? – smc

+0

是的,這是一個縮小的模板方法,4個「設計模式」團伙。在這個更簡單的變體中,子類重新定義數據的存儲和管理而不是算法本身。 – TSnyder