Struct/Resource Interfaces

We can define and implement interfaces on structs or resources.

If a type is restricted by an interface, you can only access the variables/functions specified by that interface.

cadence
		
			pub contract Test {

   pub resource interface INFT {
      pub var name: String
      pub fun updateNumber(newNumber: Int)
   }

   pub resource NFT: INFT {
      pub var name: String
      pub var number: Int

      pub fun updateNumber(newNumber: Int) {
         self.number = newNumber
      }

      init() {
         self.name = "Spongebob"
         self.number = 1
      }
   }

   pub fun noInterface() {
      let nft: @NFT <- create NFT()
      nft.updateNumber(newNumber: 5)
      log(nft.number) // 5

      destroy nft
   }

   pub fun yesInterface() {
      let nft: @NFT{INFT} <- create NFT()
      nft.updateNumber(newNumber: 5)

      /*
       ERROR - NOT ALLOWED: `number` does not belong to the interface type
       
       log(nft.number)
      */

      destroy nft
   }
}