2017-09-12 6 views
3

のメソッドを呼び出すために使用されたスーパークラス参照を決定しました。これは何度か質問されました。&は、どうやってそれがなぜ起こるのか完全に困惑しています。サブクラス

ここではシナリオです:

interface IntA { 
    void someMethod(); 
} 
interface IntB { 
    void someMethod(); 
} 

2つの単純なインタフェースは、単純なクラスで以下に

class ClassAB implements IntA,IntB { 
    @Override 
    public void someMethod(){ 
     //some logic 
    } 
} 

を実装その後、我々はそうのような&使用をインスタンス化できます。

IntA a = new ClassAB(); 
a.someMethod(); 

または他のインタフェースを介して:

IntB b = new ClassAB(); 
b.someMethod(); 

今の質問はの実装でありますsomeMethod()の場合、IntAの参照を使用しているか、IntBの参照を使用してを呼び出しているか調べることはできますか。したがって、異なるロジックを実行します。

正直なところ、これは間違った質問です。私はなぜ&がそれをどうやって行うのか理解していない。インタフェースの観点からは、機能シグニチャ&の条件を満たす実装があり、それはすべて重要です。 IntA & IntBが異なる結果を期待する場合は、2つの異なるクラスに実装する必要があります。

私はこのシナリオを2回見てきました。それで、なぜ私が頼んでいるのですか?本当に決定する方法はありますか? C/C++のような他の言語でそれを行うにはいくつかの方法がありますか?

+0

インターフェイスが異なる機能を必要とする場合は、異なるメソッド名を使用する必要があります。 –

+0

重要な場所にはどのようなシナリオがありますか? – daniu

+0

@daniu面接の質問でした。私は月に2人のランダムな面接者によってこの同じ質問に出くわしました。私が思った最初の男は間違った考え方だった。それで2人目の男が同じことを尋ねたとき、私は少し疑問に思った。 – Vineet

答えて

2

あなたはそれを実際に行うことができないだけでなく(複雑な魔法を除いて)、あなたが言ったように、それをやろうとする正当な理由はありません。

2つのインターフェイスに同じメソッドシグネチャを誤って指定した場合、同じクラスで同じ機能を実装する可能性があります。しかし、それはインタフェースの設計上の誤りです。

クリーンな方法はありませんし、汚れた方法さえも複雑なので、正しい心の誰もそれを試みることはありません。正しいアクションは、いずれかのインタフェースで異なるメソッドシグネチャを使用するようにリファクタリングすることです。このシナリオが既にの2倍になっている場合は、より大きな設計上の問題の兆候となる可能性があります。

+0

ご確認いただきありがとうございます。私が言及したとき、私はそれを2回反対しました - 私は2つの異なるインタビューセッションでそれを見つけました。私は彼らが別の言語でこのようなものを見たと思っており、Javaがそれを持っていなければならないと仮定していました。 – Vineet

+0

「面白い方法がない」とは、「インタビュー企業がそれを要求すれば、悪いソフトウェアを設計する」という意味です。私は彼らが本当にそれをして、私の必要性に疑問を投げかけているのか、彼らに尋ねるでしょう。 – daniu

+0

面接者が聞きたいことが時々分かっているのは本当に難しいです。彼らは人でもありますので、インタビュアーが自分の仕事に就いていない場合には、公式には不適切であるか、まったく間違っているかの質問を得るかもしれません。とりわけ**良い**プログラマーを見つけることが難しい現在の市場状況では、インタビュアーは、彼らが目指す専門家ではないかもしれません。 – Kayaman