少し前に .NET 関連の職種の面接を受けたとき、面接官から「プライベート インターフェイスを何に使用しますか?」と質問されました。
私は彼に、暗黙的なインターフェース実装と明示的なインターフェース実装の違いを意味しているかどうか尋ねましたが、彼は「いいえ」と答えました。
そこで私は疑問に思うのです:
- 彼は何を意味したのですか?
- プライベートインターフェースを何に使用しますか?
ベストアンサー1
インターフェースは別のクラス内ではプライベートになる可能性がある
public class MyClass
{
private interface IFoo
{
int MyProp { get; }
}
private class Foo : IFoo
{
public int MyProp { get; set; }
}
public static void Main(string[] args)
{
IFoo foo = new Foo();
return foo.MyProp;
}
}
実用性という点では、同じアセンブリ内であっても、そのインターフェースが存在することを他のコードから隠すだけです。私の意見では、これの実用性はそれほど高くありません。
明示的なインターフェース実装これは別の問題であり、非常に便利なケースがいくつかあります (特にジェネリックや古い非ジェネリック インターフェイスを扱う場合)。ただし、私はそれを「プライベート インターフェイス」とは呼びませんし、その用語がそのように一般的に使用されているとも言えません。
2 つの手法を組み合わせて使用すると、次のことが可能になります。
public class MyClass
{
private interface IFoo
{
int MyProp { get; }
}
public class Foo : IFoo
{
int IFoo.MyProp { get; set; }
}
public static void Main(string[] args)
{
IFoo foo = new Foo();
return foo.MyProp;
}
}
public class HiddenFromMe
{
public static void Main(string[] args)
{
MyClass.Foo foo = new MyClass.Foo();
return foo.MyProp; // fails to compile
}
}
これにより、ネストされたクラスを何らかの方法で公開しながら、親クラスが外部からは実行できないメソッドを呼び出すことができます。これは潜在的に便利なケースですが、あまり頻繁に使用したいものではありません。確かに、面接での使用は、面接官がそれを見て「興味深い」と思ったために使用している境界ケースのようです。