예를 들어서
1) hp를 회복시키는 아이템과
2) mp를 회복시키는 아이템이 있다.
근데 클래스를 구분지어서 만들었다.
class Hp
{
private int hpUP = 50;
void Use()
{
Player player = FindObjectOfType<Player>();
player.hp += hpUP;
유저클래스 찾아서 접근
유저 객체로 받아서 hp 증가하는 코드
}
}
class Mp
{
private int mpUP = 50;
void Use()
{
Player player = FindObjectOfType<Player>();
player.mp += mpUP;
유저클래스 찾아서 접근
유저 객체로 받아서 mp 증가하는 코드
}
}
//유저 입장 => 아래의 코드처럼 지금은 두개지만 아이템 확장될수록
//번잡해질 가능성이 높아진다. 이럴때 인터페이스 기능을 이용하면
//코드를 축소할 수 있다.
void OnTrigger2d(other)
{
Mp mp = other.GetComponent<Mp>();
if(mp != null)
{
mp.Use();
}
Hp hp = other.GetComponent<Hp>();
if(hp != null)
{
hp.Use();
}
}
public interface IItem
{
void Use();
}
//인터페이스 클래스를 상속함.
//인터페이스 클래스를 상속하면 반드시 재정의를 해야한다.
//안하면 컴파일러 에러 발생 + 그냥 빨간 밑줄 생긴다.
class Hp : IItem
{
private int hpUP = 50;
void Use()
{
Player player = FindObjectOfType<Player>();
player.hp += hpUP;
유저클래스 찾아서 접근
유저 객체로 받아서 hp 증가하는 코드
}
}
class Mp : IItem
{
private int mpUP = 50;
void Use()
{
Player player = FindObjectOfType<Player>();
player.mp += mpUP;
유저클래스 찾아서 접근
유저 객체로 받아서 mp 증가하는 코드
}
}
//유저 입장의 코드
//인터페이스를 이용해 코드 간편화가 가능하다.
//형식에 관계없이 컴파일러가 알아서 해당클래스내의 함수를 호출한다.
//인터페이스 상속받은 하위클래스는 무조건 인터페이스의 함수를
//재정의해야 하므로
void OnTrigger2d(other)
{
IItem item = other.GetComponent<IItem>();
if(item != null)
{
//알아서 찾아간다.
item.Use();
}
}