インターフェースを具体的な実装オブジェクトにキャストしますか、それともその逆ですか? 質問する

インターフェースを具体的な実装オブジェクトにキャストしますか、それともその逆ですか? 質問する

C# で、インターフェースといくつかの具体的な実装がある場合、インターフェースを具体的な型にキャストできますか、それとも具体的な型がインターフェースにキャストされますか?

この場合のルールは何ですか?

ベストアンサー1

Java と C# では、どちらの方向も許可されています。ダウンキャストには明示的なキャストが必要であり、オブジェクトの型が適切でない場合は例外がスローされる可能性があります。ただし、アップキャストには明示的なキャストは必要なく、常に安全に実行できます。

つまり、public interface Animalこの の 2 つの実装と、interface...があると仮定します。CatDog

Animal meowAnimal = new Cat();  // No cast required
Animal barkAnimal = new Dog();  // No cast required

Cat myCat = (Cat) meowAnimal; // Explicit cast needed
Dog myDog = (Dog) barkAnimal; // Explicit cast needed

Dog myPet = (Dog) meowAnimal; // Will compile but throws an Exception

明示的なキャストをtry/で囲む必要があります。C# には便利なキーワードがあります:catchas

Dog myDog = barkAnimal as Dog;
Dog myPet = meowAnimal as Dog;

例外はスローされず、myDog は nonNull になり、myPet は null になります。Java には同等のキーワードはありませんが、常にテストを使用して型の安全性を保つことができます。(" " キーワードは、if を実行し、null を失敗に割り当てるバイトコードを生成しているif (meowAnimal instanceof Dog)と思います。ただし、.NET には " " と同等のことを実行するバイトコード命令があるかもしれません。)asisas

おすすめ記事