2

どういうわけか次のスキームを実装することは可能ですか?

public interface ISomething
{
    void Go(ISpecific specific);

    void Go(Object o);
}

すべてGo(ISpecific)の呼び出しで最初のオーバーロードが呼び出され、他の可能なオブジェクトを使用した呼び出しの場合、クラスは実装にフォールバックGo(Object)ますか?

4

4 に答える 4

5

はい。これがコンパイラの動作です。

于 2011-04-27T14:11:41.397 に答える
5

これがデフォルトで機能する方法ですが、コンパイル時の型を使用します。を持っていてGo(foo)、のコンパイル時タイプがfoo実装されていない場合、実行時に参照するISpecificオブジェクトがを実装している場合でも、2番目のメソッドを呼び出します。この決定を実行時に動的に行う必要があり、C#4を使用している場合は、次のように記述できます。fooISpecific

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

...実行時に、正しいオーバーロードが選択されます。

于 2011-04-27T14:16:06.463 に答える
3

はい、それは可能です。ただし、どのオーバーロードを実行するかは、参照のコンパイル時タイプに基づいて決定されることに注意してください。

ISpecific specificVar = null;
something.Go(specificVar);  // ISomething::Go(ISpecific)
object obj = specificVar;
something.Go(obj);  // ISomething::Go(object)
于 2011-04-27T14:17:48.147 に答える
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");
    }
}
于 2011-04-27T14:40:11.570 に答える