数日前にSOで質問された次の質問に基づいて:GetType()とポリモーフィズム、およびEric Lippertの回答を読んで、GetType()仮想化しないことでオブジェクトがそのについて嘘をついていないことを本当に保証するかと考え始めましたType。
具体的には、エリックの答えは次のように述べています:
フレームワークの設計者は、オブジェクトをその型について偽ることができるようにするなど、同じ型の他の3つのメソッドと一貫性を持たせるなど、非常に危険な機能を追加しません。
さて、問題は次のとおりです。その型について偽りのないオブジェクトを、すぐに明確にせずに作成できますか?私はここで深刻な誤りを犯している可能性があり、それが事実である場合は説明が必要ですが、次のコードを検討してください。
public interface IFoo
{
Type GetType();
}
上記のインターフェースの次の2つの実装:
public class BadFoo : IFoo
{
Type IFoo.GetType()
{
return typeof(int);
}
}
public class NiceFoo : IFoo
{
}
次に、次の簡単なプログラムを実行すると、
static void Main(string[] args)
{
IFoo badFoo = new BadFoo();
IFoo niceFoo = new NiceFoo();
Console.WriteLine("BadFoo says he's a '{0}'", badFoo.GetType().ToString());
Console.WriteLine("NiceFoo says he's a '{0}'", niceFoo.GetType().ToString());
Console.ReadLine();
}
確かにbadFoo誤っTypeた出力をします。
エリックがこの動作を「信じられないほど危険な機能」として説明していることに基づいて、これが深刻な影響を持っているかどうかはわかりませんが、このパターンが信頼できる脅威をもたらす可能性はありますか?
IFoo.GetTypeそしてobject.GetType何も悪いが悪いのスタイルを除いて、ここで何が起こっているので、同じものではありません。編集:通常GetType、コンパイル時に不明なオブジェクトで呼び出されobjectます。ほとんどの場合、一部の危険なインターフェイスではありません。:)
GetTypeです。それGetTypeは重要な方法とは関係ありません。modifierキーワードGetTypeを使用して、関連するメソッドを非表示にするパブリックインスタンスメソッドを作成することもできますnew。static Type Test<T>(T t) { return t.GetType(); }(に制約がないT)のようなジェネリックメソッドがある場合Test<IFoo>(new BadFoo())でも、同様のものは元のGetTypeメソッドを呼び出します。