코드중에 어려운 부분이 있었다.
public interface IDamageable
{
void TakePhysicalDamage(int damage);
}
.
.중략
.
List<IDamageable> things = new List<IDamageable>();
.
.중략
.
private void OnTriggerEnter(Collider other)
{
if(other.TryGetComponent(out IDamageable damageable))
{
things.Add(damageable);
}
}
.
.중략
.
private void DealDamage()
{
for(int i = 0; i < things.Count; i++)
{
things[i].TakePhysicalDamage(damage);
}
}
IDamageable은 인터페이스형인데 리스트에 들어가고 심지어 함수까지 실행 가능하다는 것이 와닿지 않았다. 이 부분에 대해 조금 정리해보려고 한다.
'인터페이스는 계약을 정의한다. 해당 계약을 구현하는 class는 인터페이스에 정의된 구성원의 구현을 제공해야 합니다.
인터페이스는 다음이 포함된다.
상수
연산자
정적 생성자
중첩형식
정적필드, 메서드, 속성, 인덱서 및 이벤트
명시적 인터페이스 구현 구문을 사용한 구성원 선언
평시적 엑세스 한정자(기본 public)
클래스가 시그니처가 동일안 멤버를 포함하는 두 인터페이스를 구현하는 경우, 해당 멤버를 클래스에 구현하면 양쪽 인터페이스 모두가 해당 멤버를 구현에 사용한다.
.
.
위에 작성된 코드를 다시 봐보면, "어떠한 메서드를 지닌"인터페이스의 부분만을 떼서 그걸 List화 한것으로 생각하면 편할 것 같다
즉, 인터페이스에서 사전에 구현한 메서드만 가진 클래스의 집합이다.
그렇기에 반복문(3번째 코드)에서 interface에서 정의한 메서드를 실행할 수 있는것이다. 그리고 객체 단위로 따지면, 객체마다 가진 해당 클래스들을 리스트화시키고, 그걸 실행한다고 보면 된다.
객체들마다 가진 메서드를 실행시키려면 각각 getcomponent를 하거나.. 아무튼 복잡해질 것 같은데 인터페이스로 우아하게 잘 표현할 수 있는 것 같다.
"비슷한 행동을 하는 객체는 인터페이스로 정의하고, 상속하기!"
인터페이스 조금 복잡하죠 ㅠㅠ 수고하셨습니다!