45.3 생성자의 매개변수에 인터페이스 사용하기
생성자의 매개변수에 인터페이스 형식을 사용하면 해당 인터페이스를 상속하는 모든 클래스의 인스턴스를 받을 수 있습니다. 이 내용을 예제로 살펴보겠습니다. 다음 내용을 입력한 후 실행해 보세요.
생성자의 매개변수에 인터페이스 사용: InterfaceDemo.cs
using System;
namespace InterfaceDemo
{
//배터리 표준(강제성)
interface IBattery
{
string GetName(); //메서드 시그니처만 표시
}
class Good : IBattery
{
public string GetName() => "Good";
}
class Bad : IBattery
{
public string GetName() => "Bad";
}
class Car
{
private IBattery _battery;
//① 생성자의 매개변수로 인터페이스 형식 지정
public Car(IBattery battery)
{
_battery = battery; //넘어온 개체가 _battery 필드에 저장
}
public void Run() => Console.WriteLine(
"{0} 배터리를 장착한 자동차가 달립니다.", _battery.GetName());
}
class InterfaceDemo
{
static void Main(string[] args)
{
//ⓐ 넘겨주는 개체에 따라 배터리 이름이 다르게 표시
var good = new Car(new Good()); good.Run();
new Car(new Bad()).Run(); //개체 만들기와 동시에 메서드 실행
}
}
}
실행 결과
Good 배터리를 장착한 자동차가 달립니다. Bad 배터리를 장착한 자동차가 달립니다.
IBattery 인터페이스를 상속하는 Good과 Bad 클래스의 인스턴스는 ①처럼 IBattery 인터페이스 형식의 battery 매개변수로 받을 수 있습니다. 이러한 식으로 생성자의 매개변수로 인터페이스를 사용하면, 해당 클래스의 생성자는 개체를 하나 이상 받을 수 있는 융통성이 늘어납니다.