C# のインターフェイス
メモ。
- インターフェイスは、一つのクラスに複数に実装させることができます。
- 複数のインターフェイスを継承し、関数名が衝突した際には、少なくとも一方はインターフェイス名まで明示的に書く必要があります。
- インターフェイス名を明示的に指定してメソッドを実装する場合は、アクセス修飾子をつけられません。
- インターフェイス名を指定し実装したメソッドには、そのクラスの型を通じてアクセスできなくなります。
- 故意にインターフェイス名を指定し実装することで、そのメソッドを継承していないように見せることができます。
- 構造体にもインターフェイスを実装させることができますが、構造体をインターフェイスの型にキャストすると、暗黙のうちにボクシングが行われます。そのため、インターフェイスで値を変更したとしても、構造体の値は変更されません。
interface IStorable { void Write(); void Read(); int Status { get; set; } //!<実装はしていないことに注意 } interface ITalk { void Talk(); void Read(); } public class Document : IStorable, ITalk //!<関数の名前 Read() が衝突 { int m_Status; public Document() { Console.WriteLine("Document()"); } public void Write() { Console.Write("IStorable.Write()"); } public void Read() { Console.Write("IStorable.Read()"); } int Status { get{ return m_Status; } set{ m_Status = value; } } public void Talk() { Console.Write("ITalk.Talk()"); } public ITalk.Read() { Console.Write("ITalk.Talk()"); } //!<インターフェイス名を明示的に指定してメソッドを実装 } public class Test { Main() { Document aDoc = new Document(); aDoc.Read(); //!< IStorable.Read() が呼び出される ITalk aTalk = aDoc; aTalk.Read(); //!< ITalk.Read() が呼び出される } }