動機
突然遇到的觀念,紀錄一下
subtype
class Animal : Dog
畫成集合(Animal (Dog))
在subtype,大的可以能容納小的
Covariance
Covariance指的是下面的可以成立,就是left hand side > right hand side
Animal obj = new Dog()
Contravariance
(Animal -> void) f
(Dog -> void) g
f = g # ??
g = f # good
有變數是一個函數只能吃Animal,Animal -> void
如果把Dog -> void
,assign過去之後,有人丟Animal就直接起飛
因為明明是type decorator,卻讓看起來能容納的方向相反了!!
原本的變數就是一個集合,但是這裡套的是一個函數
函數是要求type,很像濾網,第一層type是Animal -> void
,會讓Animal都進來,但如果函數是Dog -> void
,就變成Animal放到Dog去,就一定報錯
這就是Contravariance,就是left hand side < right hand side
Covariance & Contravariance
其實就是看是哪個接資料,大的可以能容納小的
assign是left hand side去接資料 函數上實際接資料的是函數,所以其實是right hand side接資料
如果把函數的參數apply當成assign,所以就是看實際上在哪邊發生assign!!