インターフェースの基本概念
インターフェースは、特定のメソッドやプロパティの定義を含む抽象的な型であり、それらの実装はクラスや構造体に委任されます。C#では、クラスと構造体のみがインターフェースを実装できます。
簡単なサンプル
public interface IInfoProvider
{
string GetName();
string GetAge();
}
class PersonA : IInfoProvider
{
public string FullName { get; set; }
public int YearsOld { get; set; }
public string GetName()
{
return FullName;
}
public string GetAge()
{
return YearsOld.ToString();
}
}
class PersonB : IInfoProvider
{
public string FirstName { get; set; }
public string LastName { get; set; }
public double AgeValue { get; set; }
public string GetName()
{
return $"{FirstName}・{LastName}";
}
public string GetAge()
{
return AgeValue.ToString();
}
}
public static class OutputHelper
{
public static void DisplayInfo(IInfoProvider info)
{
Console.WriteLine($"名前: {info.GetName()}, 年齢: {info.GetAge()}");
}
}
static void Main(string[] args)
{
var personA = new PersonA { FullName = "John Doe", YearsOld = 35 };
var personB = new PersonB { FirstName = "James", LastName = "Doe", AgeValue = 33 };
OutputHelper.DisplayInfo(personA);
OutputHelper.DisplayInfo(personB);
}
IComparableインターフェースの使用
配列のソート機能を実現するには、IComparableインターフェースを実装する必要があります。
public class CustomData : IComparable
{
public int Value { get; set; }
public int CompareTo(object obj)
{
if (obj is CustomData other)
{
return this.Value.CompareTo(other.Value);
}
throw new ArgumentException("比較対象が無効です");
}
}
インターフェースの宣言
- アクセス修飾子はpublic、protected、internal、privateのいずれかが使用可能
- インターフェースメンバーは暗黙的にpublicであり、アクセス修飾子の指定は不可
- フィールドや静的メンバーの定義は不可
- メソッド、プロパティ、イベント、インデクサのみ定義可能
- インターフェース名は大文字のIで始めることが推奨される
インターフェースの宣言例
public interface IDataProcessor
{
void ProcessData(string input);
int CalculateResult();
}
インターフェースの実装
インターフェースを実装するには、クラスまたは構造体がそのインターフェースに含まれるすべてのメンバーを実装する必要があります。
複数インターフェースの実装
class DataHandler : IDataRetrieve, IDataStore
{
private int storedValue;
public int RetrieveValue()
{
return storedValue;
}
public void StoreValue(int value)
{
storedValue = value;
}
}
明示的なインターフェース実装
複数のインターフェースが同じシグネチャを持つメソッドを含む場合、明示的な実装を使用して区別できます。
class DualInterfaceHandler : IFirstInterface, ISecondInterface
{
void IFirstInterface.Execute()
{
Console.WriteLine("IFirstInterfaceの実装");
}
void ISecondInterface.Execute()
{
Console.WriteLine("ISecondInterfaceの実装");
}
}
インターフェースの継承
インターフェースは他のインターフェースを継承できます。
public interface IBaseInterface
{
void BaseMethod();
}
public interface IDerivedInterface : IBaseInterface
{
void DerivedMethod();
}
class ImplementationClass : IDerivedInterface
{
public void BaseMethod()
{
Console.WriteLine("ベースインターフェースの実装");
}
public void DerivedMethod()
{
Console.WriteLine("派生インターフェースの実装");
}
}