重複の可能性:
C#: インターフェイス - 暗黙的および明示的な実装
暗黙的なインターフェイスと明示的なインターフェイスの実装
こんにちは
暗黙的インターフェースと明示的インターフェースの違いを説明できる人はいますか?
ありがとう!
重複の可能性:
C#: インターフェイス - 暗黙的および明示的な実装
暗黙的なインターフェイスと明示的なインターフェイスの実装
こんにちは
暗黙的インターフェースと明示的インターフェースの違いを説明できる人はいますか?
ありがとう!
インターフェイスを明示的に実装すると、そのインターフェイスのメソッドは、オブジェクトがインターフェイスとして参照されている場合にのみ表示されます。
public interface IFoo
{
void Bar();
}
public interface IWhatever
{
void Method();
}
public class MyClass : IFoo, IWhatever
{
public void IFoo.Bar() //Explicit implementation
{
}
public void Method() //standard implementation
{
}
}
コードのどこかにこのオブジェクトへの参照がある場合:
MyClass mc = new MyClass();
mc.Bar(); //will not compile
IFoo mc = new MyClass();
mc.Bar(); //will compile
標準の実装では、オブジェクトをどのように参照するかは問題ではありません。
MyClass mc = new MyClass();
mc.Method(); //compiles just fine
暗黙的なインターフェイスの実装は、インターフェイスの同じシグネチャを持つメソッドを持つ場所です。
明示的なインターフェイスの実装では、メソッドが属するインターフェイスを明示的に宣言します。
interface I1
{
void implicitExample();
}
interface I2
{
void explicitExample();
}
class C : I1, I2
{
void implicitExample()
{
Console.WriteLine("I1.implicitExample()");
}
void I2.explicitExample()
{
Console.WriteLine("I2.explicitExample()");
}
}
明示的とは単にインターフェイスを指定することを意味し、暗黙的とは指定しないことを意味します。
例えば:
interface A
{
void A();
}
interface B
{
void A();
}
class Imp : A
{
public void A() // Implicit interface implementation
{
}
}
class Imp2 : A, B
{
public void A.A() // Explicit interface implementation
{
}
public void B.A() // Explicit interface implementation
{
}
}
また、明示的な実装が存在する理由を知りたい場合は、複数のインターフェイスから同じメソッド(名前と署名)を実装できるためです。次に、異なる機能が必要な場合、またはリターンタイプだけが異なる場合、単純なオーバーロードではこれを実現できません。次に、明示的な実装を使用する必要があります。1つの例は、とをList<T>
実装IEnumerable
しIEnumerable<T>
、両方ともGetEnumerator()
異なる戻り値を持っていることです。