2016-07-07 10 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を抽象クラスにします。このようにして、makeNoiseを呼び出すAnimalオブジェクトは存在しません。

次に、noise文字列を、その動物のサウンドに合わせて各サブクラスのコンストラクタ内の値に設定します。

+0

同じ問題。私は各サブクラスに固有の多数のパラメータを持っています。 – user2689782

+0

サブクラスに固有のものであれば、それらをパラメータとしてコンストラクタに渡す必要はありません。コンストラクタ本体の値を設定するだけです。 – Zircon

+0

スーパークラスのコンストラクタの値を設定しますか?またはサブクラス? – user2689782

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

これは、スーパークラス変数を隠すインスタンス変数 "noise"を作成します。あなたは、コンストラクタでこれを強制することができ、あなたはnoiseが定義されているためにAnimalのすべてのサブクラスを強制したい場合は

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

私はこれを理解できませんでしたか? – user2689782

+0

@ user2689782これは、スーパークラスのStringノイズを "meow"に設定し、必要な結果を与えます。 – Orin

2

: は代わりに、これはスーパークラス値を設定する必要が

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 'Animal'に渡す5つのパラメータがある場合、それらのパラメータを別のクラス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

関連する問題