Inheritance

前回に引き続き https://docs.swift.org/swift-book/LanguageGuide/Inheritance.html を読む。

  • 何からも継承してないクラスはベースクラス
  • Swiftのクラスはユニバーサル基底クラスからの継承ってのは無い
  • クラスメソッド、インスタンスメソッド、クラスプロパティ、インスタンスプロパティ、添字はオーバーライドできる
    • static funcstatic var はオーバーライドできない
  • オーバーライドする側で override キーワードをつける…誤ってオーバーライドすると予期しない振る舞いをするから
  • サブクラスでオーバーライドした実装中でスーパークラス版にアクセスするには super prefixをつける
    • super.someMethod(), super.someProperty, super[someIndex]
  • オーバーライドするプロパティの名前と型の両方を常に記述する必要がある
  • スーパークラスで読み取り専用だったプロパティを、サブクラスで読み書き可能にできる
  • スーパークラスで読み書き可能だったプロパティを、サブクラスで読み取り専用にはできない=>コンパイルエラー
  • プロパティをオーバーライドしてsetterを提供するときは、getterも提供しなきゃいけない
  • プロパティをオーバーライドして、オブザーバーを追加できる
  • willSet(sub)→willSet(super)→didSet(super)→didSet(sub) の順に呼ばれる様子
  • 定数格納型プロパティ、読み取り専用計算型プロパティは、オブザーバーを追加できない
  • 同じプロパティに対して、オーバーライドセッターとオーバーライドプロパティオブザーバーの両方を指定することはできない
    • カスタムセッターの中で値変更を監視すればよい
  • オーバーライドを禁止するのは final 修飾子
    • final var, final func, final class func, final subscript
  • サブクラス化を禁止するのは final class

self は property で super は prefix、 final は modifier、 override は keyword