모름

using System;

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 Program {
        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을 이용하면 형식검사를 컴파일할때가 아닌 프로그램 실행중으로 미룰 수 있습니다. 이를 활용한 예제중 하나가 오리타이핑이라는 위 예제입니다.

 

기본적으로 객체지향프로그래밍에선 어떤 형식이 오리라고 인정받기위해선, 조상 형식이 오리여야합니다. 즉, 오리라는 내용을 상속받아야 청둥오리가 비로소 오리라고 인정받게되는겁니다.

 

하지만 오리 타이핑에선 오리로 인정받기 위해선 그저 오리가 하는 행동을 그대로 따라하기만 하면됩니다. 오리처럼 걷고, 오리처럼 헤엄치고 오리처럼 울어대기만하면 됩니다.

 

위 예제에서 Robot은 Duck와 행동이 똑같으므로 오리타이핑의 관점에선 로봇도 오리입니다. 하지만 C#에선 컴파일할때 로봇을 오리라고 인정하지 않습니다. 이를 dynamic으로 해결할수있습니다. 위 예제를 잘 살펴보세요. 이상입니다.