C# サンプル集 |
Visual Basic 中学校 > C# サンプル集 > C# サンプル集目次 >
インターフェースの宣言
2021/4/18
一般的なインターフェース
public interface ISample
{
string Name { get; set; }
void DoSomething(string value);
int Add(int x, int y);
}
実装例
public class ConcreteSample : ISample
{
public string Name { get; set; }
public void DoSomething(string value)
{
value = value.ToUpper();
}
public int Add(int x, int y)
{
return x + y;
}
}
複数のインターフェースを実装するとメンバーの定義が重複してしまう場合があります。その場合、上記の実装例では同じ実装が使用されることになります。実装を区別したい場合は、下記のような明示的な実装を使用します。
public interface IComputer
{
string GetName();
}
public interface IUser
{
string GetName();
}
public class SystemOperator : IComputer, IUser
{
string IComputer.GetName()
{
return Environment.MachineName;
}
string IUser.GetName()
{
return Environment.UserName;
}
}
インターフェースの明示的な実装はインスタンスから直接呼び出せず、インターフェースを明示して呼び出す必要があります。
SystemOperator op = new SystemOperator();
//string name0 = op.GetName(); //←これはできない
string name1 = (op as IComputer).GetName();
string name2 = (op as IUser).GetName();
型パラメーターを持つインターフェース(ジェネリック)
public interface ISample<T>
{
T Value {get; set;}
void Skip();
}
実装例
public class ConcreteSample : ISample<DateTime>
{
public DateTime Value {get; set;}
public void Skip()
{
Value = Value.AddDays(1);
}
}
型パラメーターを解決しないで実装することもできます。
public class ConcreteSample<T> : ISample<T>
{
public T Value {get; set;}
public void Skip()
{
//Do Something
}
}
インターフェースを継承するインターフェース
public interface IHuman : ISpeaker, IWalker
{
void Think();
}
public interface ISpeaker
{
void Speak();
}
public interface IWalker
{
void Walk();
}
実装例
public class Human : IHuman
{
public void Speak()
{
//Do Something
}
public void Walk()
{
//Do Something
}
public void Think()
{
//Do Something
}
}
メモ:実装時に複数のインターフェースを カンマで区切って指定することもできます。
既定の実装を含むインターフェース
C# 8.0(2019年9月)以降は、インターフェースに既定の実装を含められます。
public interface IComputer
{
string GetName()
{
return "MachineName";
}
}
public class Operator : IComputer
{
// 空
}
インターフェースの既定の実装はインスタンスから直接呼び出せず、インターフェースを明示して呼び出す必要があります。
Operator op = new Operator();
//string name0 = op.GetName(); //←これはできない
string name1 = (op as IComputer).GetName(); // MachineName
メモ:C#に十分詳しくない場合は、この機能を使用しないことをお勧めします。代わりに拡張メソッドでインターフェースで拡張することも検討してください。
参考
インターフェイス - C# プログラミング ガイド | Microsoft Docs