C#におけるインターフェースの理解と実装

インターフェースの基本概念

インターフェースは、特定のメソッドやプロパティの定義を含む抽象的な型であり、それらの実装はクラスや構造体に委任されます。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("派生インターフェースの実装");
    }
}

タグ: C# インターフェース IComparable as演算子 明示的実装

6月12日 20:19 投稿