728x90
인터페이스를 설계하기 위해서는 추상화를 잘해야 하는데 추상화를 잘하려면 연습과 경험이 많이 필요하다
인터페이스를 잘못 설계했다가 나중에 파생 클래스를 수정해야 할 일이 생기면 위로는 인터페이스를 수정하고 아래로는 자신의 파생 클래스들, 옆으로는 형제 클래스들을 줄줄이 수정해야 하는 일이 생긴다.
덕타이핑은 이런 문제를 만났을 때 좀 더 유연하게 해결할 수 있도록 돕는다
상속 관계를 이용하지 않기 때문에 프로그램의 동작에 관여하는 부분만 손을 대면 된다
using System;
using System.Text;
using System.Threading.Tasks;
namespace DuckTyping
{
class Duck
{
public void Walk()
{
Console.WriteLine(this.GetType() + ".Walk");
}
public void Swim()
{
Console.WriteLine(this.GetType() + ".Swim");
}
public void Quack()
{
Console.WriteLine(this.GetType() + ".Quack");
}
}
class Mallard : Duck
{
}
class Robot
{
public void Walk()
{
Console.WriteLine("Robot.Walk");
}
public void Swim()
{
Console.WriteLine("Robot.Swim");
}
public void Quack()
{
Console.WriteLine("Robot.Quack");
}
}
class MainApp
{
static void Main(string[] args)
{
dynamic[] arr = new dynamic[] { new Duck(), new Mallard(), new Robot() };
foreach (dynamic duck in arr)
{
Console.WriteLine(duck.GetType());
duck.Walk();
duck.Swim();
duck.Quack();
Console.WriteLine();
}
}
}
컴파일러가 dynamic 키워드를 만나면 프로그램을 실행할 때 형식 검사를 하도록 미룬다
class MyClass
{
public void FuncAAA()
{
//Do Nothing
}
}
class MainApp
{
static void Main(string[] args)
{
dynamic obj = new MayClass();
obj.FuncAAA();
obj.FuncBBB(); /*FuncBBB() 메소드를 선언하지 않았지만 obj가 dynamic으로 선언되어서
컴파일러 형식 검사를 피해간다*/
}
}
728x90
'c#' 카테고리의 다른 글
[C#] DataTable (0) | 2023.01.06 |
---|---|
[C#] dynamic 동적 형식 (0) | 2023.01.06 |
[C#] Interface (0) | 2023.01.05 |
[C#] 순수 함수 (0) | 2023.01.04 |
[C#] 함수형 프로그래밍 (0) | 2023.01.04 |