は、それが何らかの形で次のスキームを実装することが可能です:C#の過負荷問題
public interface ISomething
{
void Go(ISpecific specific);
void Go(Object o);
}
ように、すべてのGo(ISpecific)
コールの最初のオーバーロードが呼び出され、他の可能性との通話のためのクラスがフォールバックだろうオブジェクトられる実装のGo(Object)
へ?
は、それが何らかの形で次のスキームを実装することが可能です:C#の過負荷問題
public interface ISomething
{
void Go(ISpecific specific);
void Go(Object o);
}
ように、すべてのGo(ISpecific)
コールの最初のオーバーロードが呼び出され、他の可能性との通話のためのクラスがフォールバックだろうオブジェクトられる実装のGo(Object)
へ?
コンパイル時にタイプのを使用すると、デフォルトでどのように動作するのですか。 Go(foo)
があり、foo
のコンパイル時のタイプがISpecific
を実装していない場合、実行時にfoo
が参照するオブジェクトがISpecific
を実装していても、2番目のメソッドが呼び出されます。あなたがしたい場合は、この決定は実行時で動的に行われる、とあなたはC#4を使用している場合、あなたは書くことができます:
dynamic value = GetValue();
something.Go(value);
を...と、実行時に、正しい過負荷が選択されます。
このフォームの有用性の例を提案できますか?面白い、私はちょうど今朝の分散と過負荷についてあなたのブログ記事の一つを読んでいた。 –
@Justin:ダイナミックなタイピングの仕方ではあまり気にしませんので、私はよく分かりませんが、OP *のように聞こえるかもしれません。 –
はい。これがコンパイラの仕組みです。
はい、可能です。ただし、どのようなオーバーロードを行うかの決定は、参照のコンパイル時のタイプに基づいて行われます。
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");
}
}
を出力します。コンパイラで簡単な例を試したときに何を見つけましたか? – taylonr