{
public T ํจ์()
{
return (T)this;
}
}
public class ์์ํด๋์ค : ํด๋์ค<์์ํด๋์ค>
{
}
์๋ ๊ฒ ๋์ด์์ผ๋ฉด, ํจ์ ์คํ์์
๋ฐํ์์์ this๋ฅผ T๋ก ์บ์คํ ํ๋๊ฑฐ์ผ?
์๋๋ฉด ๊ทธ๋ฅ ๋ช ์ํด์ฃผ๊ธฐ์ํด (T)๋ฅผ ๋ถ์ฌ์ ์ปดํ์ผํ์์ ์บ์คํ ํด์ฃผ๋ ๊ทธ๋ฐ๋๋์ธ๊ฑฐ์ผ?
์ ์๋ผ๋ฉด ๊ฒฐ๊ตญ ๋ค์ด์บ์คํ ์ด๋ผ๋๊ฑฐ๊ณ ์ฑ๋ฅ์ ์ผ๋ก๋ ์ํด์ธ๊ฑด๊ฐ?
๋ค์ด์บ์คํ ์ ๋ฐฉ์งํ๋ ค๋ฉด ์ด๋ฐ์์ผ๋ก ํ๋ฉด๋๋๊ฑด๊ฐ?
๋ฐฉ๋ฒ 1.
public abstract class ํด๋์ค<T> where T : ํด๋์ค<T>
public abstract T ํจ์();
}
public class ์์ํด๋์ค : ํด๋์ค<์์ํด๋์ค>
{
public override ์์ํด๋์ค ํจ์()
{
return this;
}
}
๋ฐฉ๋ฒ2.
public abstract class ํด๋์ค<T> where T : ํด๋์ค<T>
{
protected T ๋ฐ์ดํฐ;
public T ํจ์()
{
return ๋ฐ์ดํฐ;
}
}
public class ์์ํด๋์ค : ํด๋์ค<์์ํด๋์ค>
{
public ์์ํด๋์ค()
{
๋ฐ์ดํฐ = this;
}
}
์์์ด๋ ์ ๋ค๋ฆญ์ด๋ ๊ฐ์ด ์ฌ์ฉํ๋ ํท๊ฐ๋ฆฌ๋๋ฐ ๊ฒ์ํด๋ด๋ ์ ๋ชจ๋ฅด๊ฒ ์ด...
๋๊ธ์ ๋ํ gpt ๋ต๋ณ ์ถ๊ฐ.
์ง๋ฌธ์ ๋ญ ๋จผ์ ๋ฌป๋์ ๋ฐ๋ผ ๋๋ต์ด ๋ฌ๋ผ์ก์.
๋งค๋ฒ new chatํ๊ณ ์ง๋ฌธํ๊ฑฐ๊ณ .
์ปดํ์ผ๋ ์ง์ ๋๋ ํ์์ผ๊ฑธ?
๊ทธ๋ ๊ฒ ์ง? ใณใณ
gptํํ ๋ฌผ์ด๋ดค์ผ๋ฉด ๋ฐ๋ก ์๋ ค์คฌ์ํ ๋ฐ
gpt๋ ์ค๋ต์ ์ ๋ต๋ง๋ฅ ๋งํ๊ธฐ๋๋ฌธ์ ๋ฏฟ์ ์๋ ์๊ณ ํน์๋ ํด์ ๋ฌผ์ด๋ดค๋๋ฐ ๋ฐํ์์ ์บ์คํ ํ๋ ๋ฌผ์ด๋ณด๋ฉด ๋ฐํ์์ ์บ์คํ ํ๋ค๊ณ ๋๋ตํ๊ณ ์ปดํ์ผ ํ์์ ์บ์คํ ํ๋๊ณ ๋ฌผ์ด๋ณด๋ฉด ์ปดํ์ผํ์์ ์บ์คํ ํ๋ค๊ณ ๋๋ตํจ.
๋ณธ๋ฌธ์ ์ฌ์ง ์ถ๊ฐํ์ด
vTable ์ฐ๋ virtual ํจ์ ๋นผ๋ฉด ํจ์๋ ์ ๋ถ static binding ์ผ ๊ฑธ?
์์ ์ข ์ด์ฌํ ๋ค์๊ฑธ... ๋๋ ์ด๋ ค์ด๊ฒ์ด์ผ...
(T)this๋ ๋ฐํ์์บ์คํ ์. class Base where T : BaseใTใ constraint๋ ๋ ์๊ฐ๋ณด๋ค ๊ด๋ํจ. ์ ๋ฐ ์ ์ฝ์ ๊ฑธ์ด๋๋ class A : BaseใAใ, class B : BaseใAใ๋ ์ปดํ์ผ์ด ๋จ. static cast์์ผ๋ฉด BaseใAใ์์ B๋ก ์บ์คํ ํ๋๊ฒ illegalํ๋ค๊ณ ์ปดํ์ผ์๋ฌ๋ก ๋ด๋๊ฒ ์ง.
์ด๋ฐ๊ฑฐ ํผ์์ ์ ํํ๊ฒ ์์๋ด๊ณ ์ถ์ผ๋ฉด ์ง์ IL ๊น๋ณด๋๊ฒ ๋ต์. (T)this์์ callvirt (late binding) ํธ์ถํ๋ค
๊ฐ์ฌํฉ๋๋ค. ์ง์ ํด๋ณด๋ ๋ง์ํ์ ๋ฐ์ ๋ค๋ฅด๊ฒ return (T)this์์ IL_0001: ldarg.0 // this IL_0002: unbox.any !0/*T*/ IL_0007: stloc.0 // V_0 IL_0008: br.s IL_000a ์๋ ๊ฒ ํธ์ถ๋๋ค์. ๋ฐฉ๋ฒ 1์ ์์ฑํ ํจ์๋ฅผ ํธ์ถํด๋ณด๋ฉด callvirt๊ฐ ํธ์ถ๋๊ณ ์.
์ ์๋ฆฌ ํท๊ฐ๋ ธ์. unbox.any๊ฐ ํธ์ถ๋๋๊ฒ ๋ง์. ๊ทธ๋ฆฌ๊ณ unbox.any๋ ๊ณต์๋ฌธ์ ์ฝ์ด๋ณด๋ฉด "InvalidCastException is thrown if obj is not a boxed type." ์ด๋ผ๊ณ ์จ์ ธ์์. ๊ณ ๋ก ๋ฐํ์์์ ๋ฆฌํ๋ ์ ์ผ๋ก child๋ก castํด๋ safeํ์ง ์๋์ง ํ์ธํ๊ณ ๋ฆฌํดํ๋ค๋ ๋ป์.