본인쟝 일주일 전 인터페이스를 모두 이해한 사람으로써 알려드림
범위 공격 스킬이 있다고 가정했을 때
이 스킬로 잡몹이랑 벽이랑 부술 수 있는 오브젝트에게 피해를 줬음.
이 때 얘네들이 갖고 있는 피해 관련 함수(TakeDamage, HandleDamage, PlayDestroyAnim 등)를 찾아서 일일히 호출해야함
그냥 일반몬스터, 엘리트몬스터, 보스몬스터였다면
상속 구조를 통해 피해 관련된 함수를 호출하면 되겠지만
잡몹, 벽, 부술 수 있는 오브젝트는 서로 너무 다른 성격의 오브젝트이기에 상속은 부적합함.
그러나 이 오브젝트들이 IDamageable 인터페이스를 구현한 상태라면
인터페이스가 구현한 공통 함수를 호출함으로써 한번에 퉁칠 수 있음.
내부 구현은 각각 다르지만 모두 TakeDamage 함수를 갖고 있다는 걸 서로 알고 있으니
여러번 일할 필요 없어짐.
마찬가지로 상호작용이 필요한 문이나 아이템, NPC 등
세이브할 때 현재 상황 퍼가요 필요한 애들 등
무기, 아이템, 스킬, 몬스터 데이터를 하나로 관리할 때 등
성격이 다른 애들을 공통적으로 묶어서 처리해야하고 서로 각각 다른 행동을 해야할 때
쓰면 좋은 거 같음
내 설명이 틀렸다면 아래 인붕이들이 고쳐줄거야 이만
공격 패턴, 이동 패턴이 다르지만 내용은 동일한 몬스터 구현할 때도 해당 부분만 인터페이스 생성자로 붙여주면 무척 편하더라
간단히 말하면 데미지를 받는 오브젝트를 가져와야할 때 오브젝트들의 클래스가 다 따로놀면 타입을 가져오기 까다로움 그렇다면 특정 클래스를 상속받고 다운캐스팅을 하면 간단해지겠지? 근데 c#에서 클래스는 한가지의 클래스밖에 상속받지 못해 그럼 확장성이 떨어지겠지 이 때 다중 상속이 가능한 인터페이스를 사용하면 이 점을 해결할 수 있어
나도 좆밥이 아는 내용에서 아는척 한거니 고수들이 정정하거나 덧붙여 주셈
쓰다가 까먹은 내용 보충하자면 그럼 인터페이스가 상속 클래스 상위호환이냐?는 아님 인터페이스는 틀만 잡아 줄 뿐이고 로직은 직접 구현못해 상속받을 클래스들이 공통적으로 구현해야 할 내용이 있다면 인터페이스만 사용해서는 다 일일히 복붙으로 해야겠지 그래서 공통적으로 구현할 부분은 클래스로 상속시키고 비교적 간단한 역할을 부여해 줄 때 인터페이스를 사용하면
됨
공통 구현만 필요할때는 인터페이스 필요없고 공통 작업이 있을때 사용해야함 위에서 말한대로 몬스터, 벽, 부술 수 있는 오브젝트에 공통적으로 구현할 TakeDamage를 인터페이스로 넘기고 처리했는데 뭐 벽은 폭탄으로만 파괴 가능하고 부술 수 있는 오브젝트는 근접공격으로만 처리 가능하고 이런 상황이면 공통 작업이 없어서 사용해도 복잡성만 올라감 결론적으로 IDamageable등 특정 인터페이스를 받아서 공통적으로 처리해야 하는 상황이 있을때 만들면 됨
엄.. 그건 벽에 박힌 이후 로직이 담당하면 되지 않나여? 폭탄으로만 파괴 가능하더라도 일단 벽에 닿았을때 피격 이펙트 같은 건 무조건 띄워야할 것 같은데
뭐 상황에 따라서 차이가 있겠지만 폭탄으로는 벽만 파괴할수 있는 상황이면 TakeDamage 함수로 데미지 타입등등 정보 넘기고 데미지 타입 확인하고 이런게 복잡성만 높힌다는거지 폭탄에서 벽 확인하고 뭐 벽 내구도에 따라 처리하고 하면 되는데 다른 모든 TakeDamage함수도 수정해야 하니까 점점 복잡해지지 글에서 처럼 공통적인 행동을 해야할때는 상관 없음 공격 타입이랑 상관 없이 공격 받았을때 피격 효과 표시하고 데미지 표시하고 등등 하면 좋지
아하.. 배워갑니다
예전부터 궁금했던건데 인터페이스를 상속받는거랑 virtual 함수를 가진 클래스를 상속받는거랑은 뭐가 다른건가요? 인터페이스는 다중 상속이 된다는 것 말고는 큰 차이점이 없나요??
추상 클래스의 경우에도 인터페이스처럼 이 메서드 필수야~ 라고 강제할 순 있지만, 만약 추가될 클래스에서 이미 다른 클래스를 상속 받고 있을 땐 사용이 불가능한데다가.. 인터페이스와 달리 추상 클래스의 가상 메서드는 상속 받고나서 그냥 뒀을 때 부모 클래스 메서드 기능을 그대로 사용하고, 또는 오버라이드해서 기능을 바꿀 수 있기도 해서 모호한 면이 있지만.. 인터페이스는 반드시 직접 기능을 구현해야 되니까 실수가 줄어들테니 이런 부분이 차이나는 거 아닐까여
인터페이스 쓰면 가장 좋은점은 벽 부시는 이펙트 에니메이션으로 구현되있고 이걸 실행한다 하면 복사한 벽들 다 부셔짐 ALL엑터 클레스로 불러와서 포이치 적용해도 동일 엑터 에니메이션이 강제로 재생됨 하지만 인터페이스를 넣으면 부실때 폭탄이던 사람이던 인터페이스 호출 하나로 간단하게 오브젝트 하나하나 부실수있음. 게임플레이 테그로 벽1 벽2 벽3 벽4 넣는거보다 간단하고 상당히 좋음