2012-06-11 43 views
0

動物基地班的Java擴展類和設定值

public class Animal 
{ 

protected String pig; 
protected String dog; 
protected String cat; 

public void setPig(String pig_) 
{ 
    pig=pig_; 
} 
public void setCat(String cat_) 
{ 
    cat=cat_; 
} 
public void setDog(String dog_) 
{ 
    dog=dog_; 
} 

} 

AnimalAction類

public class AnimalAction extends Animal 
{ 
    public AnimalAction(String pig, String cat, String dog) 
    { 
     super.pig = pig; 
     super.cat = cat; 
     super.dog = dog; 
    } 

} 

請問這是正確的方式來設置保護的變量?正在使用保護變量正確的方式來做到這一點?有更專業的OO方式嗎?

+1

爲什麼你有setter但不使用它們? – Poindexter

+1

請大寫您的課程。這是Java中的標準。 – cheeken

+0

@Poindexter在構造函數中使用非final設置器可能會產生醜陋的效果,如果一個子類覆蓋它們。這個問題應該是 - 「爲什麼你的制定者不是最終的?」 ;) – kostja

回答

0

您應該可以使用this.pig等,因爲您繼承了受保護的成員。您也可以實際調用public setPig(...)方法。

+0

謝謝托馬斯,這種整體方法看起來是否正確? – stackoverflow

+0

它會工作,但不是一個好辦法。在這裏的其他答案中有幾種更正確的方法。 – Thomas

0

沒有必要使用super前綴或任何其他前綴來訪問受保護的變量。

順便說一句 - 我不同意Thomas的觀點 - 不要在構造函數中調用超類的setter方法。如果一個子類覆蓋它們,在構造函數中使用非final Setter可能會產生難看的效果。然後他們可以被稱爲一個不完整的對象。但是你應該考慮讓你的制定者最後決定,如果你不意味着他們被覆蓋。

Joshua Bloch在Effective Java book中解釋了「繼承或禁止設計」的原理。

0

使用protected成員變量沒有任何錯誤,然後在子類中繼承它們。

但是,如果開發人員出現並將您的班級劃分爲子類,他們可能會搞砸了,因爲他們完全不瞭解它。除了公共接口以外的私有成員,他們無法看到具體實現的具體細節,以便您日後更改它。 通過提供protected member variables你只是緊密地在你的子類和超類之間進行耦合。

2

您可以使用私有變量而不是受保護的。這將更加貼切。 您可以使用構造函數來設置超類的值。 編輯:

public class Animal{ 

    private String pig; 
    private String dog; 
    private String cat; 

    public Animal(String pig,String dog,String cat){ 
     this.pig=pig; 
     this.dog=dog; 
     this.cat=cat; 
    } 

} 


public class AnimalAction extends Animal 
{ 
    public AnimalAction(String pig, String cat, String dog) 
    { 
     super(pig,dog,cat); 
    } 

} 
0

成員變量在班級以外可見的越少越好。我會讓類變量private並使getter公開(或根據需要)&保護setter。

0

你的例子很混亂,但它會起作用。我將舉另一個例子:

//使用大寫字母作爲類/接口/枚舉,小寫字母用於方法/字段。

public class Animal 
{ 
protected String name; 
protected int numberOfFeet; 

public Animal(String name) 
{ 
    this.name = name; 
} 

public void setNumberOfFeet(int numberOfFeet) 
{ 
    this.numberOfFeet = numberOfFeet; 
} 
} 

public class Dog extends Animal 
{ 
    public Dog() 
    { 
     super("dog"); // call the constructor of the super class. 

     // because Dog extends Animal and numberOfFeet is protected, numberOfFeet becomes part of "this" class. 
     this.numberOfFeet = 4; 
    } 
} 

//Now you can create instances of Animal like: 
Animal bird = new Animal("bird"); 
bird.setNumberOfFeet(2); 
//Or use Dog to create an animal "dog" with 4 feet. 
Animal dog = new Dog(); 

//after an accident 
dog.setNumberOfFeet(3); 
+0

大聲笑很好。我很欣賞這個反應 – stackoverflow