ย ย ย ย public abstract class Event<T> : Event where T : Event<T>
์ด์ผํด์ํด์ผ๋จ???
๋ป ๊ทธ๋๋ก ๊ทธ๋ฅ Event ์ธ๋ฐ T์ ๋ค์ด๊ฐ์ ์๋ ํ์ ์ด Event ๋ผ๋๊ฑฐ๊ฒ ์ง ์ ์ ๋ฐ๊ฒ ํ์ํ์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง
< T > ๋ผ๊ณ ์ผ๋๋ฐ ๋ถ๋ฑํธ๊ฐ ๋๊ธ๋ฌ๋ฉด์ ๋ค ์ปท๋๋ค ์๋ฐ ใ ใ ใ ใ
T์ event๋ฅผ ๋ฃ๋๋ค๋๊ฑฐ ์๋? ๋ญ์ง๋ชจ๋ฅด๊ฒ ๋ค ๋ญ์ผ ๋์ฒด
ํํ ๋ฆฌ์ผ ์ฝ๋์ ์๋๋ฐ;
public class test : Simulation.Event(test ) ์ฌ์ฉํ ๋๋ ์ด๋ ๊ฒ ์ฐ๋๋ฐ Event(test )๋ฅผ ๋ง๋ค๋ ค๋ฉด test๊ฐ Event(test )๋ฅผ ๊ตฌํํด์ผ ํ๋๋ฐ ์ ๋ญ์ง
Event๋ฅผ ์์๋ฐ๊ณ ํ ํ๋ ์ดํธ๋ ์ค์ง ์ด ์ถ์์ ํด๋ผ์ค๋ง ํ์ฉํ๋ค? ๋๋ ๋ชจ๋ฅด๊ฒ ๋ค
์ ๊ฑฐ ํน์ ํ ์ธํฐํ์ด์ค ๊ตฌํํ ๊ฐ์ฒด๋ง ๋ฃ์ ์ ์๊ฒ ์ ์ฝ๊ฑฐ๋๊ฑธํ ๋ฐ
ํ ํ๋ฆฟ์์ ๋ญ ์๋ฅผ ๋ค๋ฉด IFly.Fly() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉด T๊ฐ IFly๋ฅผ ๊ตฌํํ ๊ฑธ ๋ณด์ฅํด์ผ ํ์์
๊ทธ๋์ ํ๋ก๊ทธ๋๋ฐํ ์ ์ ์๋ฅผ ๋ค์ด ์ ๋ ๊ฒ ๊ตฌํํ PlaneList์ ๋ง๋ค์๋๋ฐ Human์ด IFly๋ฅผ ๊ตฌํ ์ํ์ผ๋ฉด ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ ๊ฑฐ์ง
๊ณ ๊ฑด ์๋๋ฐ ๋ฌธ์ ๋ a< t > ์ ์์ฑ์์์ t๊ฐ a์ ํ์ํด๋์ค์ฌ์ผ๋๋ค๋ ๋ป์ผ๋ก ์ฝํ์
๋ง์ฐฌ๊ฐ์ง์ง T๊ฐ ์ ์ถ์๋ฉ์๋๋ฅผ ๊ตฌํํ Event๊ฐ์ฒด๋ง ๋ฐ๋๋ก
๊ทธ ๋ป ๋ง๊ณ ์๊ฐํด๋ณด๋ฉด ๋ฑํ ์ด์ํ ๊ฒ๋ ์์
์ ๋ค๋ฆญ์ ๋ค์ ์ ๋ค๋ฆญ ์๋๊ฑธ๋ก ๋ฐ๊พธ๋ ค๋๋ด. ์ต์์ Event ์ ๊ณตํต์ฝ๋๋ค ์๊ณ ๊ทธ Event๋ฅผ ์ ๋ค๋ฆญ์ผ๋ก ๋ง๋ค๊ณ ๊ทธ๊ฑธ ๋ค์ ์์๋ฐ์์ ์ ๋ค๋ฆญ ์๋๊ฑธ๋ก ์ฐ๋ ค๋๊ฑฐ ๊ฐ์๋ฐ ๊ทธ๋ฅ ์ ๋ค๋ฆญ ์ํ๋ก ์ฐ๋ฉด ์๋๋ ์ด์ ๊ฐ์๊ฒ ์๋๋ณด์ง.. ์ฌ๋ฌํ์ ์ ์ด๋ฒคํธ๋ฅผ ํ ๋ฆฌ์คํธ์ ๋ฃ์ด์ผ๋๋ค๋๊ฐ..
์ค์ ๊ตฌํ์ฒด๋ฅผ ์๊ฐํ๋ฉด ์ดํด๊ฐ ์ฌ์.
public class PlayerDamageEvent : Event< PlayerDamageEvent > ๋ผ๋ ๊ผด๋ก ์ธ๊ฑฐ์
์ฌ๊ท์ ์ธ ๋๋์ผ๋ก ๋ฐ์ ๋ค์ฌ์ ธ์ ์ดํด๊ฐ ํ๋ค ์ ์์ ใ ใ
๊ทธ๋ผ where T : A๋ A๋ฅผ T๋ก ์บ์คํ ํ๊ธฐ์ํ ์ฅ์น ๋ฑ ๊ทธ๊ฑฐ์ธ๊ฑด๊ฐ
T : A < T >
์ ๋ค๋ฆญ์ผ๋ก ํ์ ์ ๋ฐ์๊ฑด๋ฐ, ์ด๋์ ๋ ํ์ด ์กํ์๋ ํ์ ์ ๋ฐ๊ฒ ๋ค๋ ์ ์ธ์ด์ง
์ ๋ ๊ฒ ํ๋ฉด ๊ธฐ๋ฅ์ด ๊ตฌํ๋์ด ์์๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ ์ ๋ค๋ฆญ ์ฝ๋๋ฅผ ์งค ์ ์๊ฑฐ๋
๋ป ๊ทธ๋๋ก ๊ทธ๋ฅ Event ์ธ๋ฐ T์ ๋ค์ด๊ฐ์ ์๋ ํ์ ์ด Event ๋ผ๋๊ฑฐ๊ฒ ์ง ์ ์ ๋ฐ๊ฒ ํ์ํ์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง
< T > ๋ผ๊ณ ์ผ๋๋ฐ ๋ถ๋ฑํธ๊ฐ ๋๊ธ๋ฌ๋ฉด์ ๋ค ์ปท๋๋ค ์๋ฐ ใ ใ ใ ใ
T์ event๋ฅผ ๋ฃ๋๋ค๋๊ฑฐ ์๋? ๋ญ์ง๋ชจ๋ฅด๊ฒ ๋ค ๋ญ์ผ ๋์ฒด
ํํ ๋ฆฌ์ผ ์ฝ๋์ ์๋๋ฐ;
public class test : Simulation.Event(test ) ์ฌ์ฉํ ๋๋ ์ด๋ ๊ฒ ์ฐ๋๋ฐ Event(test )๋ฅผ ๋ง๋ค๋ ค๋ฉด test๊ฐ Event(test )๋ฅผ ๊ตฌํํด์ผ ํ๋๋ฐ ์ ๋ญ์ง
Event๋ฅผ ์์๋ฐ๊ณ ํ ํ๋ ์ดํธ๋ ์ค์ง ์ด ์ถ์์ ํด๋ผ์ค๋ง ํ์ฉํ๋ค? ๋๋ ๋ชจ๋ฅด๊ฒ ๋ค
์ ๊ฑฐ ํน์ ํ ์ธํฐํ์ด์ค ๊ตฌํํ ๊ฐ์ฒด๋ง ๋ฃ์ ์ ์๊ฒ ์ ์ฝ๊ฑฐ๋๊ฑธํ ๋ฐ
ํ ํ๋ฆฟ์์ ๋ญ ์๋ฅผ ๋ค๋ฉด IFly.Fly() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉด T๊ฐ IFly๋ฅผ ๊ตฌํํ ๊ฑธ ๋ณด์ฅํด์ผ ํ์์
๊ทธ๋์ ํ๋ก๊ทธ๋๋ฐํ ์ ์ ์๋ฅผ ๋ค์ด ์ ๋ ๊ฒ ๊ตฌํํ PlaneList์ ๋ง๋ค์๋๋ฐ Human์ด IFly๋ฅผ ๊ตฌํ ์ํ์ผ๋ฉด ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ ๊ฑฐ์ง
๊ณ ๊ฑด ์๋๋ฐ ๋ฌธ์ ๋ a< t > ์ ์์ฑ์์์ t๊ฐ a์ ํ์ํด๋์ค์ฌ์ผ๋๋ค๋ ๋ป์ผ๋ก ์ฝํ์
๋ง์ฐฌ๊ฐ์ง์ง T๊ฐ ์ ์ถ์๋ฉ์๋๋ฅผ ๊ตฌํํ Event๊ฐ์ฒด๋ง ๋ฐ๋๋ก
๊ทธ ๋ป ๋ง๊ณ ์๊ฐํด๋ณด๋ฉด ๋ฑํ ์ด์ํ ๊ฒ๋ ์์
์ ๋ค๋ฆญ์ ๋ค์ ์ ๋ค๋ฆญ ์๋๊ฑธ๋ก ๋ฐ๊พธ๋ ค๋๋ด. ์ต์์ Event ์ ๊ณตํต์ฝ๋๋ค ์๊ณ ๊ทธ Event๋ฅผ ์ ๋ค๋ฆญ์ผ๋ก ๋ง๋ค๊ณ ๊ทธ๊ฑธ ๋ค์ ์์๋ฐ์์ ์ ๋ค๋ฆญ ์๋๊ฑธ๋ก ์ฐ๋ ค๋๊ฑฐ ๊ฐ์๋ฐ ๊ทธ๋ฅ ์ ๋ค๋ฆญ ์ํ๋ก ์ฐ๋ฉด ์๋๋ ์ด์ ๊ฐ์๊ฒ ์๋๋ณด์ง.. ์ฌ๋ฌํ์ ์ ์ด๋ฒคํธ๋ฅผ ํ ๋ฆฌ์คํธ์ ๋ฃ์ด์ผ๋๋ค๋๊ฐ..
์ค์ ๊ตฌํ์ฒด๋ฅผ ์๊ฐํ๋ฉด ์ดํด๊ฐ ์ฌ์.
public class PlayerDamageEvent : Event< PlayerDamageEvent > ๋ผ๋ ๊ผด๋ก ์ธ๊ฑฐ์
์ฌ๊ท์ ์ธ ๋๋์ผ๋ก ๋ฐ์ ๋ค์ฌ์ ธ์ ์ดํด๊ฐ ํ๋ค ์ ์์ ใ ใ
๊ทธ๋ผ where T : A๋ A๋ฅผ T๋ก ์บ์คํ ํ๊ธฐ์ํ ์ฅ์น ๋ฑ ๊ทธ๊ฑฐ์ธ๊ฑด๊ฐ
T : A < T >
์ ๋ค๋ฆญ์ผ๋ก ํ์ ์ ๋ฐ์๊ฑด๋ฐ, ์ด๋์ ๋ ํ์ด ์กํ์๋ ํ์ ์ ๋ฐ๊ฒ ๋ค๋ ์ ์ธ์ด์ง
์ ๋ ๊ฒ ํ๋ฉด ๊ธฐ๋ฅ์ด ๊ตฌํ๋์ด ์์๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ ์ ๋ค๋ฆญ ์ฝ๋๋ฅผ ์งค ์ ์๊ฑฐ๋