2011-04-27 23 views
2

は、それが何らかの形で次のスキームを実装することが可能です:C#の過負荷問題

public interface ISomething 
{ 
    void Go(ISpecific specific); 

    void Go(Object o); 
} 

ように、すべてのGo(ISpecific)コールの最初のオーバーロードが呼び出され、他の可能性との通話のためのクラスがフォールバックだろうオブジェクトられる実装のGo(Object)へ?

+1

を出力します。コンパイラで簡単な例を試したときに何を見つけましたか? – taylonr

答えて

5

コンパイル時にタイプのを使用すると、デフォルトでどのように動作するのですか。 Go(foo)があり、fooのコンパイル時のタイプがISpecificを実装していない場合、実行時にfooが参照するオブジェクトがISpecificを実装していても、2番目のメソッドが呼び出されます。あなたがしたい場合は、この決定は実行時で動的に行われる、とあなたはC#4を使用している場合、あなたは書くことができます:

dynamic value = GetValue(); 
something.Go(value); 

を...と、実行時に、正しい過負荷が選択されます。

+0

このフォームの有用性の例を提案できますか?面白い、私はちょうど今朝の分散と過負荷についてあなたのブログ記事の一つを読んでいた。 –

+0

@Justin:ダイナミックなタイピングの仕方ではあまり気にしませんので、私はよく分かりませんが、OP *のように聞こえるかもしれません。 –

5

はい。これがコンパイラの仕組みです。

3

はい、可能です。ただし、どのようなオーバーロードを行うかの決定は、参照のコンパイル時のタイプに基づいて行われます。

ISpecific specificVar = null; 
something.Go(specificVar); // ISomething::Go(ISpecific) 
object obj = specificVar; 
something.Go(obj); // ISomething::Go(object) 
0

はいこれは間違いなく動作しますが、ISpecificでないオブジェクトはすべてオブジェクトオーバーロードを呼び出します。

確認するコンソールアプリを作成しました。

それが動作します

Object 
Object 
Specific 

class Program 
{ 
    static void Main() 
    { 
     Object aSpecific = new Object(); 
     String nonSpecific = "nonSpecific"; 
     ISpecific specific = new Specific(); 

     ISomething something = new Something(); 

     something.Go(aSpecific); 
     something.Go(nonSpecific); 
     something.Go(specific); 

     Console.ReadKey(); 
    } 
} 

interface ISpecific 
{ 
    void GoGo(); 
} 

interface ISomething 
{ 
    void Go(ISpecific specific) 
    void Go(Object o) 
} 

Class Specific : ISpecific 
{ 
    public Specific() { } 

    public void GoGo() 
    { 
     Console.WriteLine("Specific"); 
    } 
} 

Class Something : ISomething 
{ 
    public Something() { } 

    public void Go(ISpecific specific) 
    { 
     specific.GoGo() 
    } 

    public void Go(Object o) 
    { 
     Console.WriteLine("Object"); 
    } 
} 
関連する問題