2016-06-15 9 views
-1

私は抽象クラスを作成して、2つの異なるクラスのコードを結合しています。どちらのコードも似ていますが、1行の違いがあります。同様の部分を持つ抽象メソッドを作成するにはどうすればよいですか?余分なコード行を持つクラスを区別するにはどうすればよいですか?例えば2つのほぼ同じメソッドを持つJava抽象クラス

public void exampleOneMethod(int number) { 
    ***userChoice = choice - 2;*** 
    while (userChoice.getNumber(number) == 0) { 
    number-- 
    } 
    option = false; 
} 

public void exampleTwoMethod(int number) { 
    while (userChoice.getNumber(number) == 0) { 
    number-- 
    } 
    option = false; 
} 

public void abstractMethod(int number) { 
    while (userChoice.getNumber(number) == 0) { 
    number-- 
    } 
    option = false; 
} 

を私は入れてはどうすればよいuserChoice =選択 - 2; example1が抽象クラスを拡張している場合にのみ、抽象クラスに追加できますか?

+1

あなたはしていません。代わりに、クラス階層を再設計して、example1がハッキングに頼らずに正しい動作を得るようにします。インターフェイスを使用することもできます。 –

答えて

2

どうか代わりにinterfaceを試してみてください。

public interface newInterface { 
    default void exampleTwoMethod(int number) { 
     while (userChoice.getNumber(number) == 0) { 
      number-- 
     } 
     option = false; 
    } 

    default void exampleOneMethod(int number) { 
     userChoice = choice - 2; 
     while (userChoice.getNumber(number) == 0) { 
      number-- 
     } 
     option = false; 
     } 
    } 
} 

あなたがしたいにこのインタフェースを実装します。

例1のために:

public class exampleOneClass implements newInterface { 
    public void exampleOneMethod(int number) { 
     newInterface.super.exampleOneMethod(number) 
    } 
} 

例えば2つ:

public class exampleTwoClass implements newInterface { 
    public void exampleTwoMethod(int number) { 
     newInterface.super.exampleTwoMethod(number) 
    } 
} 

やって少しぎこちないですこれは、Timがコメントで提案したように、再構築を検討する必要があるかもしれませんクラス階層を掘り下げる

デフォルトののJavaのメソッドの詳細については、このリンクを参照してください。 https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

+0

このプログラムにインターフェイスを使わないように言われれば、これは私の最高の答えです。それは私が私が尋ねていたもの以外の解決策を見つけるのを助けました。そのメソッドを抽象クラスから除外し、必要な変数にゲッターを使用しました。 –

1

別の2つの別のクラスに拡張する必要があります。 extendは共通コードを共有するためだけであり、共通コードでない場合は継承の実装に適合しないため、composition is generally favored over inheritanceです。

追加の操作を抽象メソッドに入れて、クラスを2回拡張し、メソッドを空のままにするか、またはexampleOneMethodを2つの別々の拡張クラスで実装するだけです。あるいは、継承に合うように再設計するか、または構図を使用するように再設計します。

関連する問題