2016-07-07 103 views
-2

我有一個情況超類/子類方法

public class Animal 
{ 
    String noise; 

    public String makeNoise() 
    { 
     return noise; 
    } 
} 

這時會出現與噪聲的具體定義一個子類。

public class Dog extends Animal{ 
    String noise = "woof"; 
} 

public class Cat extends Animal{ 
    String noise = "meow"; 
} 

我想要做的就是

Animal cat = new Cat(); 
cat.makeNoise(); // This will be 'meow' 

Animal dog = new Dog(); 
dog.makeNoise(); // This will be 'woof' 

基本上,我不想重複makeNoise()方法當我創造一個動物。但是,這不起作用。 (噪聲是空字符串)

我可以使用一個靜態對象像

static String NoiseDog = "woof" 
static String NoiseCat = "meow" 

但再我必須寫對每隻動物的makeNoise()方法。有沒有更好的方法來設計這個?

+2

設置在每個子類的構造函數的超類的噪音成員。你只需要在super中實現makeNoise()。 – bhspencer

回答

0

使Animal類的抽象。這樣,就不會有如Animal對象那樣的東西,它調用makeNoise

然後,將noise String設置爲適合該動物聲音的每個子類的構造函數中的值。

+0

同樣的問題。我有大量的參數是每個子類特有的。 – user2689782

+0

如果它們是特定於子類的,則不必將它們作爲參數傳遞給構造函數。只需在構造函數體中設置值即可。 – Zircon

+0

在超類的構造函數中設置值?還是子類? – user2689782

1
public class Cat extends Animal{ 
    String noise = "meow"; 
} 

這將創建一個名爲「noise」的實例變量來隱藏超類變量。 相反,你需要用它來設置超值:

public class Cat extends Animal{ 
    public Cat() { 
     noise = "meow"; 
    } 
} 
+0

我不明白這一點? – user2689782

+0

@ user2689782這將超類中的字符串噪聲設置爲「喵」,給你你想要的結果。 – Orin

2

如果要強制Animal所有子類有noise定義,您可以實現在構造函數中:

public abstract class Animal { 
    private final String noise; 

    public Animal(final String noise) { 
     this.noise = noise; 
    } 

    public String makeNoise() { 
     return noise; 
    } 
} 

然後犬:

public class Dog extends Animal { 
    public Dog() { 
     super("woof"); 
    } 
} 

和貓:

public class Cat extends Animal { 
    public Cat() { 
     super("meow"); 
    } 
} 

並對其進行測試:

public class Test { 
    public static void main(String[] args) { 
     final Animal dog = new Dog(); 
     System.out.println(dog.makeNoise()); 
     final Animal cat = new Cat(); 
     System.out.println(cat.makeNoise()); 
    } 
} 

輸出:

woof 
meow 
+0

謝謝你。在我的真實世界的例子中,有5個不同的參數需要爲每個類別設置不同的參數。所以在構造函數中傳遞5個值並不容易。 – user2689782

+0

@ user2689782如果你有5個參數傳遞給'Animal',你可以將這些參數包裝到另一個類'AnimalCharacteristics'中,並將其傳遞給'Animal'。 –

+0

嗯,很酷的想法。 – user2689782

0

或者,你可以實現一個接口:

動物:

public interface Animal { 
    public String makeNoise(); 
} 

犬:

public class Dog implements Animal { 
    public String makeNoise() { 
     return "woof"; 
    } 
} 

貓:

public class Cat implements Animal { 
    public String makeNoise() { 
     return "meow"; 
    } 
} 

測試:

public class Test { 
    public static void main(String[] args) { 
     Animal dog = new Dog(); 
     System.out.println(dog.makeNoise()); 
     Animal cat = new Cat(); 
     System.out.println(cat.makeNoise()); 
    } 
} 

輸出:

woof 
meow 
+0

在這種情況下,我必須在每個類中定義makeNoise()方法。我試圖擺脫這一點。 – user2689782