어떠한 클래스를 재정의 하고 싶은 경우 보통 해당 클래스를 상속 받아 재정의 하여 사용하곤 한다.
하지만 그 클래스가 open class가 아닌 경우는 재정의를 할 수가 없는데, 이 때는 상속을 대신해 델리게이트 패턴사용한다.
재정의하고 싶은 클래스(ArrayList)의 인터페이스(MutableCollection)를 똑같이 구현한 클래스(NewArray)를 제조한다.
NewArray는 ArrayList를 멤버로 하나 가진다.
NewArray에서 MutableCollection의 메소드를 구현하는데, 재정의하고싶은 부분은 재정의하고, 나머지는 멤버인 ArrayList가 수행하도록 한다.
classNewArray<T>:MutableCollection<T>{varobjectAdded=0valinnerList=arrayListOf<T>()// 재정의 할 메소드들overridefunadd(element:T):Boolean{objectAdded++returninnerList.add(element)}overridefunaddAll(elements:Collection<T>):Boolean{objectAdded+=elements.sizereturninnerList.addAll(elements)}// 아래는 재정의 할 필요가 없으므로 innerList가 위임(델리게이트)하여 수행overridevalsize:Intget()=innerList.sizeoverridefuncontains(element:T)=innerList.contains(element)overridefuncontainsAll(elements:Collection<T>)=innerList.containsAll(elements)overridefunisEmpty()=innerList.isEmpty()overridefunclear()=innerList.clear()overridefuniterator()=innerList.iterator()overridefunremove(element:T)=innerList.remove(element)overridefunremoveAll(elements:Collection<T>)=innerList.removeAll(elements)overridefunretainAll(elements:Collection<T>)=innerList.retainAll(elements)}
위와 같이 위임을 하면 재정의 할 필요가 없는데도 MutableCollection를 구현해야 한다는 이유만으로
많은 메소드들을 일일이 위임시켜줘야 한다. 이 과정을 Kotlin에서는 by키워드를 통해 생략하도록 할 수 있다.