どういうわけか次のスキームを実装することは可能ですか?
public interface ISomething
{
void Go(ISpecific specific);
void Go(Object o);
}
すべてGo(ISpecific)
の呼び出しで最初のオーバーロードが呼び出され、他の可能なオブジェクトを使用した呼び出しの場合、クラスは実装にフォールバックしGo(Object)
ますか?
どういうわけか次のスキームを実装することは可能ですか?
public interface ISomething
{
void Go(ISpecific specific);
void Go(Object o);
}
すべてGo(ISpecific)
の呼び出しで最初のオーバーロードが呼び出され、他の可能なオブジェクトを使用した呼び出しの場合、クラスは実装にフォールバックしGo(Object)
ますか?
はい。これがコンパイラの動作です。
これがデフォルトで機能する方法ですが、コンパイル時の型を使用します。を持っていてGo(foo)
、のコンパイル時タイプがfoo
実装されていない場合、実行時に参照するISpecific
オブジェクトがを実装している場合でも、2番目のメソッドを呼び出します。この決定を実行時に動的に行う必要があり、C#4を使用している場合は、次のように記述できます。foo
ISpecific
dynamic value = GetValue();
something.Go(value);
...実行時に、正しいオーバーロードが選択されます。
はい、それは可能です。ただし、どのオーバーロードを実行するかは、参照のコンパイル時タイプに基づいて決定されることに注意してください。
ISpecific specificVar = null;
something.Go(specificVar); // ISomething::Go(ISpecific)
object obj = specificVar;
something.Go(obj); // ISomething::Go(object)
はい、それは間違いなく機能します。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");
}
}