C#은 믹스인을 지원하지 않고, Java와 같은 인터페이스 기반의 다중 상속을 선택했다.
하지만 이 방법은 '구현'을 상속하지 못한다는 점에서 굉장히 불편한데, 아래의 예제에 어떤 경우에 불편한지 예제를 작성해 보았다.
IPrintable 인터페이스는 디버그 용도 등을 위해 해당 클래스의 모든 프로퍼티들을 콘솔에 출력하기 위한 용도로 만들어졌다.
여기서 짜증나는 점은, Print 메소드는 무조건 직접 구현해야 한다는 것이다.
알다시피 C#은 런타임에 모든 프로퍼티의 이름, 값들을 리스트로 가지고있다. 그렇기에 사실 저렇게 직접 하나하나 다 찍어야 할 필요는 전혀 없다. 누가 대신 찍어줄수도 있다는 말이다.
위의 루비 예제는 mixin을 이용하여 모든 인스턴스 멤버의 값을 출력하는 Printable을 구현한것을 보여준다. 이렇듯이 루비는 구현(module) 자체를 포함(mixin)시킬 수 있다.
C#에서도 이러한 믹스인 기능을 흉내내서 사용할 수 있는데, 멀쩡한 방법은 아니지만, 나같이 괴상한 프로그래밍 방법을 추구하는 사람들에게는 재미있는 장난감이 될 수는 있다.
이제 다중 상속이 가능하면서, 구현까지 같이 상속할 수 있는 믹스인의 특성을 흉내낸 이상한 물건이 완성되었다. 심지어 인터페이스(여기서는 IPrintable)에 인터페이스 메소드를 정의해서 사용자가 구현해야 하는 부분은 사용자에게 맡기고, 내가 대신 구현해줄수 있는 부분은 extend 메소드로 처리하는것도 가능하다!
하지만 이와같은 괴상한 방법은 당연히 많은 한계점과 단점을 가지는데,
- 상속을 피해간다는 minxin의 철학에서 벗어난다.
- 일반적인 interface의 용법과 다르다, 이는 언어의 설계 의도를 벗어난 행위이며 보는 사람을 혼란스럽게 할 수 있다.
- 루비에서는 module 문법이 제공되지만, C#에서는 인터페이스를 빌려 사용한다. 따라서 인터페이스가 가지는 한계점들을 그대로가진다.
- 상수를 정의할 수 없다. (아래 코드는 불가능하다)
- 자신만의 필드는 가질 수 없고, 프로퍼티는 재구현되어야 한다.
- 모든 메소드, 프로퍼티는 반드시 public 이어야 한다.
- 스코프가 this가 아니다.
사실 이것만 보면 절대 쓰면 안되는 악마의 물건처럼 보인다, 그렇기에 extend를 응용하여 이러한 방법의 구현도 가능하다는 정도만 알아두면 좋을 것 같다.
다음에 시간이 나면 다른 minxin툴을 통해 위 방법보다 깔끔하게 클래스들을 믹스인시키는 방법에 대해 작성해보고자 한다.
'C#' 카테고리의 다른 글
[C#] string과 String의 차이 (0) | 2015.11.11 |
---|---|
[C#] Using static 사용하기 (0) | 2015.10.21 |
[C#] Thread.SpinWait와 SpinWait 구조체의 차이 (0) | 2015.10.20 |
[C#] Thread.Sleep의 await(Task) 버전 (0) | 2015.10.19 |
[PostSharp] ReaderWriterSynchronized (0) | 2015.10.15 |