2017-11-12 11 views
2

私はインタフェースの2つの方法があります:引数としてメソッドを受信コールJavaでメソッドで引数2〜方法

public interface ISort 
{ 
    public void insertionSort(final String[] a); 
    public void selectionSort(final String[] a); 
} 

レッツ・コール・メソッドを、 - 方法B

まず、私は特定する必要がありますどのインタフェースメソッドが呼び出され、メソッドBの対応するインタフェースメソッドが呼び出されます。複雑さは、メソッドBの特定の機能にあります。メソッドBは、両方のインタフェースメソッドで完了します。つまり、必要なインターフェイスメソッド呼び出しをカプセル化する一時変数が必要です。すべてのインタフェースメソッドが実装されています。

public void runTest(ISort sort) 
{ 
     String[] list=stringsFromFile(); 
     sort=sort.selectionSort(list); 
     if(sort.toString().equals("insertionSort")){ 
      sort=sort.insertionSort(list); 
     } 

     sort(list) 
} 

この問題は明らかです。私はこの問題に直面して以来、私は一日中解決策を見つけるのに過ごしましたが、私は何も見つけられず、私は立ち往生していません。

+0

は、なぜあなたはこのようにそれを行う必要があるのですか? –

+1

'sort = sort.insertionSort(list);'これが 'ISort'でどのように宣言されているのか分かりません。これは 'void'メソッドです。それはあまり明確ではありません。 – davidxxx

+0

sort.toStringを使用する場合、 "insertionSort"と同じ方法はありません。 – Christian

答えて

0

今日の終わりに、私は解決になりました。これは本当に簡単です。私はこの悪夢の解決に貢献したすべての人に感謝の意を表します。特に、@ zilotti@ruakhのおかげで、私は自分のジレンマを解決する正しい方向を示しました。

デバッグ中に、いくつかのクラス変数にもかかわらず、文字通り何もrunTestメソッドに渡されていないことがわかりました。

ソリューション:runTest()メソッドには、SelectionSortまたはInsertionSortのクラスインスタンスを渡すだけでした。

ここにある:

public void main(){ 
    SelectionSort sorter=new SelectionSort(); 
    runTest(sorter); 

    InsertionSort sorter2=new InsertionSort(); 
    runTest(sorter2); 
} 
2

インターフェイスには、実際には1つのメソッド、sortが必要です。挿入ソートと選択ソートは、同じ「ソート」抽象化の2つの実装であり、異なるクラスで表現できます。 、代わりに、同じインターフェイスで両方の並べ替え方法を有するので

public void runTest(final ISorter sorter) { 
    final String[] array = stringsFromFile(); 
    sorter.sort(array); 
    // TODO validate that the array is now sorted 
} 
+0

あなたのアイデアをもっと詳しく教えてもらえますか? – Sean

+0

@Sean:もちろん。 'runTest'のようなコードを追加しました。 – ruakh

1

void sort(final String[] a)方法で一つのインタフェースを作成し、それには2つの異なる実装を提供し、1:sortを呼び出す方法は、彼らが呼んでいるどちらかを知る必要はありません挿入ソート用と別のソート用、選択ソート用。

public interface ISort { 
    void sort(final String[] a); 
} 

public class SelectionSort implements ISort { 
    @Override 
    public void sort(final String[] a) { 
     // Your implementation 
    } 
} 

public class InsertionSort implements ISort { 
    @Override 
    public void sort(final String[] a) { 
     // Your implementation 
    } 
} 

runTestを呼び出すメソッドは、ISort実装を選択する必要があります。

public void example() { 
    ISort sorter = new SelectionSort(); 
    runTest(sorter); 
} 

public void runTest(ISort sort) 
{ 
    String[] list = stringsFromFile(); 
    sort(list); 
    // Use sorted array here 
} 
+0

はい、これは@ruakhが提案したものですが、これを行っていますが、奇妙な問題があります。runTestメソッドはソートメソッドを見ませんが、引数に渡していますが – Sean

+0

静的コンテキストで使用していますか? – izilotti

+0

どういう意味ですか? – Sean

関連する問題