委托 by Delegation
類別委托
Kotlin的委托,我覺得十分像設計模式中的代理人模式。
就是旅客跟旅行社買機票,但實際付錢是旅客付。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// BuyTicket介面 要做的事
interface BuyTicket {
fun pay()
}
// 旅客實作BuyTicket介面的pay方法。
// 真正要做事的人
class Tourist : BuyTicket {
override fun pay() = println("旅客提供信用卡 卡號付錢")
}
// 旅行社實作BuyTicket介面的pay方法,實際上是旅客付錢。
// 代理人
class Agency(tourist: BuyTicket) : BuyTicket by tourist
1
2
3
4
5
6
7
8
fun main() {
// 真正要做事的人
val tourist = Tourist()
// 代理人,把 真正要做事的人 的傳入
val agency = Agency(tourist)
// 實際上是旅客付錢,不是代理人付錢
agency.pay()
}
旅客提供信用卡 卡號付錢
以上的內容要有Java程式碼對映才比較明白。
BuyTicket介面
1
2
3
public interface BuyTicket {
void pay();
}
旅客實作BuyTicket介面的pay方法。
1
2
3
4
5
6
public class Tourist implements BuyTicket{
@Override
public void pay() {
System.out.println("旅客提供信用卡 卡號付錢");
}
}
旅行社實作BuyTicket介面的pay方法,實際上是旅客付錢。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Agency implements BuyTicket{
// 成員屬性要有旅客Tourist
private Tourist tourist;
// 使用建構子參數,把旅客傳入旅行社
public Agency(Tourist tourist) {
this.tourist = tourist;
}
@Override
public void pay() {
// 實際上是呼叫旅客的pay()方法
tourist.pay();
}
}
Client測試
1
2
3
4
5
6
7
8
9
10
public class Client {
public static void main(String[] args) {
// 建立旅客
Tourist tourist = new Tourist();
// 把旅客傳入旅行社的建構子
Agency agency = new Agency(tourist);
// 旅行社付錢,實際上旅客付的。
agency.pay();
}
}
旅客提供信用卡 卡號付錢
語法
class 代理人(真正要做事的人: 要做的事) : 要做的事 by 真正要做事的人
class Agency(tourist: BuyTicket) : BuyTicket by tourist