2011-01-28 10 views
0

JavaやC#でインタフェースメソッドを特定の汎用メソッドに配線することは可能ですか?言い換えればJava/C#インタフェース配線

は、私が実際のメソッドを呼び出すスタブメソッドなしで、次の操作を行うことができます。私は、コンパイラは、それが関係しているすべてはワイヤーIInterface1であることを認識できるほど賢くなることを願ってい

public interface IInterface1 
{ 
    object DoSomething(object withThis); 
} 

public interface IInterface2 
{ 
    object DoSomethingElse(object withThis); 
} 

public class SomeClass : IInterface1, IInterface2 
{ 
    object DoesNothing(object withThis) 
    { 
     return withThis; 
    } 

    object IInterface1.DoSomething(object withThis) // stub method 
    { 
     return DoesNothing(object withThis); 
    } 

    object IInterface2.DoSomethingElse(object withThis) // stub method 
    { 
     return DoesNothing(object withThis); 
    } 
} 

をし、 IInterface2をDoSomethingElseメソッドに追加し、スタブメソッドを飛び越さずに...?

乾杯、 J

+0

コンパイラがこのような状況をどのように処理するのかというご質問はありますか? – Jay

+0

種類は...コンパイラがコンパイル時にスタブメソッドを削除するかどうかは関係ありませんが...スタブメソッドなしでこれを行う方法はありませんか? –

答えて

0

コンパイラは、コンパイル時にスタックトレースを読みにくくすることはありません。しかし、両方の言語の最近の実行時間には、インラインで実行するジャストインタイムコンパイラがあります。 JITは、多くの縮退したメソッド呼び出しを取り除き、実際のコードを移動して、メソッド引数への参照とメソッド空間の割り当てに関連する他のオーバーヘッドへの参照を避けることができます。

実際に特定の方法がインライン展開できるかどうかは、実行時の言語とバージョンによって異なります。これは、たとえば、Java Beanの縮退ゲッターとセッターのチェーンが、実際に実行時に無駄になったレジスタスペースの大きなヒープパイルに変換されない理由です。

0

私にとって、それはコードの正確な同じ部分を実行異なる方法を持ってしても意味がありません。私は、インターフェイスが定義しているものをリファクタリングすることから始めたいと思います。

+0

インターフェイスは外部プロバイダからのもので、両方を実装する必要があります。もちろん、上記の例は最小限の簡潔な例です。 –

0

いいえ、これはスタブメソッドを追加しないとできません。 DoesNothingと同じシグネチャを持つクラスにDoesNothing2メソッドがあった場合はどうなりますか?コンパイラはどのようなものを使用するのかを知っていますか?それは非常に特殊なようです。

+0

また、現代のIDEではインターフェイスを実装するためのスタブが生成されるため、それほど悪くはありません。 –