.NET 2 / 3 / 4 / 4.5 / 4.6.1 ๋ฐ .Net Core 2.1 ๋์์์ ํ ์คํธ ๋ ์ํ ์ฝ๋๋ ๋ชจ๋ ๋์ผํฉ๋๋ค. ์ ์ด๋ ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๊น?
๋ถ๋ช
ํ PrintIt<T>
๋ํ ํธ์ถ์ ์ฌ๋ฐ๋ฅธ ์ ํ Bar
ํ์ง๋ง ์ค์ ๋ก ์ฌ๋ฐ๋ฅธ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง๋ ์์ต๋๋ค.
interface PrintMe
{
void Print();
}
class Foo : PrintMe
{
public void Print()
{
Console.WriteLine("Foo!");
}
}
class Bar : Foo
{
public new void Print()
{
Console.WriteLine("Bar!");
}
}
class Program
{
static void Main(string[] args)
{
PrintIt<Foo>();
PrintIt<Bar>();
var foo = new Foo();
var bar = new Bar();
foo.Print();
bar.Print();
Console.ReadKey();
}
static void PrintIt<T>() where T : PrintMe, new()
{
new T().Print();
}
}
Foo!
Foo!
Foo!
Bar!
Foo!
Bar!
Foo!
Bar!
Print ()๋ฅผ 'new' ํ๋ฉด ํด๋น ๋ฉ์๋๋ PrintMe ์ธํฐํ์ด์ค์ ์ผ๋ถ๊ฐ ์๋๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
((PrintMe)new Bar()).Print();
์ ๋ค๋ฆญ์ด ์ ํ ์์ต๋๋ค.
์ด๊ฒ์ CLR์ดํ๋ ์ผ์ ๋ํ ์ง๋ฌธ์ด ์๋๋ผ ์ธ์ด๊ฐํ๋ ์ผ์ ๋ํ ์ง๋ฌธ์ ๋๋ค. C # ์ฌ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํด๋์ค๋ ๊ธฐ๋ณธ ํด๋์ค์์ ์ ๊ณตํ๋ ๋ชจ๋ ์ธํฐํ์ด์ค ๊ตฌํ์ ์์ํฉ๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ๋ช ์ ์ ์ผ๋ก ๋ค์ ๊ตฌํ ํ์ง ์์ผ๋ฉด ํ์ ํด๋์ค๋ ๊ธฐ๋ณธ ํด๋์ค์์ ์์ํ๋ ์ธํฐํ์ด์ค ๋งคํ์ ์ด๋ค ์ ์ผ๋ก๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ์ฌ์์ ์์ ๊ฒ๊ณผ ๊ฑฐ์ ๋์ผํ ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฆ, ์ํ๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ ค๋ฉด ์ธํฐํ์ด์ค๋ฅผ ๋ค์ ๊ตฌํํด์ผํฉ๋๋ค.
c#
class Bar : Foo, PrintMe
{
public new void Print()
{
Console.WriteLine("Bar!");
}
}
@svick ๋ต๋ณ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
Print ()๋ฅผ 'new' ํ๋ฉด ํด๋น ๋ฉ์๋๋ PrintMe ์ธํฐํ์ด์ค์ ์ผ๋ถ๊ฐ ์๋๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ ๋ค๋ฆญ์ด ์ ํ ์์ต๋๋ค.