클래스 위임

클래스의 위임은 특정 클래스에 자기 클래스가 할 일을 다른 클래스에 맡겨 처리하는 것

위탁자 : 위임을 맡기는 클래스

수탁자 : 위임을 받아서 실제 처리하는 클래스

interface Base {    // 인터페이스 정의
    fun say()
}

fun main(args: Array<String>) {

    class BaseImpl(val x: Int):  Base{      // 인터페이스를 구현한 위임클래스 정의
        override fun say() {                // 메서드 구현
            println("베이스 클래스 구현 : " + x)
        }
    }

    class Derived(b: BaseImpl) : Base {     // 인터페이스를 구현하고 위임 처리할 객체를 인자로 받음
        override fun say() {        // 위임 처리할 메서드 구현
            b.say()                 // 실제 처리할 메서드 구현
        }
    }

    val b = BaseImpl(10)        // 위임 객체를 만든다
    Derived(b).say()               // 실제 사용할 객체를 만들고 메서드 호출

}

왜인지 모르겠으나 오류가 뜸 Kotlin: Unresolved reference: b

interface Base {    // 인터페이스 정의
    fun say()
}

fun main(args: Array<String>) {

    class BaseImpl(val x: Int):  Base{      // 인터페이스를 구현한 위임클래스 정의
        override fun say() {                // 메서드 구현
            println("베이스 클래스 구현 : " + x)
        }
    }

    class Derived_() : Base by BaseImpl(10)     //클래스 객체를 생성해서 by로 위임
                                // 인터페이스는 상속했기에 클래스 내부에서 메서드 사용 가능
    Derived_().say()    // 인터페이스의 메서드 실행
}

베이스 클래스 구현 : 10

생성자의 매개변수 속성으로 위임 처리

이렇게 하면 여러 클래스에 대한 위임 처리가 가능해짐

interface Sayable {    // 인터페이스 정의
    fun say()
}

fun main(args: Array<String>) {

    class Person(val x: String):  Sayable{      // 인터페이스를 구현한 위임클래스 정의
        override fun say() {                // 메서드 구현
            println("안녕하세요 " + x)
        }
    }

    class Pet(val x: String):  Sayable{      // 인터페이스를 구현한 위임클래스 정의
        override fun say() {                // 메서드 구현
            println("멍멍 " + x)
        }
    }

    val ps = Person("사람")
    val pt = Pet("개")

    class Saying(val say: Sayable) : Sayable by say // 매개변수로 전달한 객체로 위임 처리
																		// 인터페이스를 가지고 위임 처
    Saying(ps).say()
    Saying(pt).say()
}