インタフェースの型は型のアノテーション内で直接使用できない為、代わりにIntersection Type(以下、インターセクション型と記す)の一部として使用する必要があります。 インターセクション型は、Intersection内部にリストされたすべてのインタフェースに適合した一つの値を表します。
インターセクション型の構文は{U1, U2, ... Un}
であり、ここで型U1
からUn
は、インタフェースに適合することになる型です。
インターフェースのフィールド、関数、そのセットが利用できます。
インターセクション型は、さまざまな異なる入力値で動作する関数を記述する際に便利です。例えば、引数の型にインターセクション型を使用することで、その関数はIntersection内の全ての、インタフェースを実装した値にアクセスすることができます。値はIntersection内部の機能に制限されます。関数が誤って他の機能にアクセスしようとした場合、静的チェッカーによってブロックされます。
access(all)
struct interface HasID {
access(all)
let id: String
}
access(all)
struct A: HasID {
access(all)
let id: String
init(id: String) {
self.id = id
}
}
access(all)
struct B: HasID {
access(all)
let id: String
init(id: String) {
self.id = id
}
}
// Create two instances, one of type `A`, and one of type `B`.
// Both types conform to interface `HasID`, so the structs can be assigned
// to variables with type `{HasID}`: Some resource type which only allows
// access to the functionality of resource interface `HasID`
let hasID1: {HasID} = A(id: "1")
let hasID2: {HasID} = B(id: "2")
// Declare a function named `getID` which has one parameter with type `{HasID}`.
// The type `{HasID}` is a short-hand for `AnyStruct{HasID}`:
// Some structure which only allows access to the functionality of interface `HasID`.
//
access(all)
fun getID(_ value: {HasID}): String {
return value.id
}
let id1 = getID(hasID1)
// `id1` is "1"
let id2 = getID(hasID2)
// `id2` is "2"
インタフェースが2つ以上存在する場合は、その型を実装した値(補足: リソースまたはStruct)はその両方を実装する必要があります。
access(all)
struct interface HasMetadata {
access(all)
var metadata: AnyStruct
}
access(all)
struct C: HasID, HasMetadata {
access(all)
let id: String
access(all)
var metadata: AnyStruct
init(id: String) {
self.id = id
self.metadata = []
}
access(all)
fun setMetadata(_ data: AnyStruct) {
self.metadata = data
}
}
// valid, because `C` implements both `HasID` and `HasMetadata`.
let hasID3: {HasID, HasMetadata} = C(id: "3")
// Invalid, because `A` implements only `HasID`.
let hasID4: {HasID, HasMetadata} = A(id: "4")
翻訳元->https://cadence-lang.org/docs/language/intersection-types