Swift-inheritance

提供:Dev Guides
移動先:案内検索

スイフト-継承

より多くの形式を取る能力は、継承として定義されます。 通常、クラスは別のクラスからメソッド、プロパティ、機能を継承できます。 クラスはさらにサブクラスとスーパークラスに分類できます。

  • サブクラス-クラスが別のクラスからプロパティ、メソッド、および関数を継承する場合、サブクラスとして呼び出されます
  • スーパークラス-他のクラスをそれ自体から継承するためのプロパティ、メソッド、および関数を含むクラスは、スーパークラスと呼ばれます

Swift 4クラスには、メソッド、プロパティ、関数、およびオーバーライドメソッドを呼び出してアクセスするスーパークラスが含まれています。 また、プロパティオブザーバーは、プロパティを追加し、保存または計算されたプロパティメソッドを変更するためにも使用されます。

基本クラス

別のクラスからメソッド、プロパティ、または関数を継承しないクラスは、「基本クラス」と呼ばれます。

class StudDetails {
   var stname: String!
   var mark1: Int!
   var mark2: Int!
   var mark3: Int!

   init(stname: String, mark1: Int, mark2: Int, mark3: Int) {
      self.stname = stname
      self.mark1 = mark1
      self.mark2 = mark2
      self.mark3 = mark3
   }
}

let stname = "Swift 4"
let mark1 = 98
let mark2 = 89
let mark3 = 76

print(stname)
print(mark1)
print(mark2)
print(mark3)

プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-

Swift 4
98
89
76

クラス名StudDetailsのクラスは、ここでは学生の名前を含むために使用される基本クラスとして定義され、3つの科目はmark1、mark2、mark3としてマークされます。 「let」キーワードは、基本クラスの値を初期化するために使用され、基本クラス値は「print」機能の助けを借りてプレイグラウンドに表示されます。

サブクラス

既存のクラスに基づいて新しいクラスを作成する行為は、「サブクラス」として定義されます。 サブクラスは、基本クラスのプロパティ、メソッド、および機能を継承します。 サブクラスを定義するには、基本クラス名の前に「:」を使用します

class StudDetails {
   var mark1: Int;
   var mark2: Int;

   init(stm1:Int, results stm2:Int) {
      mark1 = stm1;
      mark2 = stm2;
   }
   func print() {
      print("Mark1:\(mark1), Mark2:\(mark2)")
   }
}

class display : StudDetails {
   init() {
      super.init(stm1: 93, results: 89)
   }
}

let marksobtained = display()
marksobtained.print()

プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-

Mark1:93, Mark2:89

クラス 'StudDetails’は、学生マークが宣言されているスーパークラスとして定義され、サブクラス 'display’は、スーパークラスからマークを継承するために使用されます。 サブクラスは生徒のマークを定義し、print()メソッドを呼び出して生徒のマークを表示します。

オーバーライド

スーパークラスインスタンス、型メソッド、インスタンス、型プロパティ、および添え字サブクラスにアクセスすると、オーバーライドの概念が提供されます。 「override」キーワードは、スーパークラスで宣言されたメソッドをオーバーライドするために使用されます。

スーパークラスのメソッド、プロパティ、サブスクリプトへのアクセス

「スーパー」キーワードは、スーパークラスで宣言されたメソッド、プロパティ、およびサブスクリプトにアクセスするためのプレフィックスとして使用されます

Overriding Access to methods,properties and subscripts
Methods super.somemethod()
Properties super.someProperty()
Subscripts super[someIndex]

メソッドのオーバーライド

継承されたインスタンスおよびタイプのメソッドは、サブクラスで定義されたメソッドの 'override’キーワードによってオーバーライドできます。 ここでは、サブクラスでprint()がオーバーライドされ、スーパークラスのprint()で言及されているtypeプロパティにアクセスします。 また、cricket()スーパークラスの新しいインスタンスが「cricinstance」として作成されます。

class cricket {
   func print() {
      print("Welcome to Swift 4 Super Class")
   }
}

class tennis: cricket {
   override func print() {
      print("Welcome to Swift 4 Sub Class")
   }
}

let cricinstance = cricket()
cricinstance.print()

let tennisinstance = tennis()
tennisinstance.print()

プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-

Welcome to Swift Super Class
Welcome to Swift Sub Class

プロパティのオーバーライド

継承されたインスタンスまたはクラスプロパティをオーバーライドして、そのプロパティに独自のカスタムgetterおよびsetterを提供したり、プロパティオブザーバを追加して、基になるプロパティ値が変更されたときにオーバーライドプロパティが監視できるようにすることができます。

プロパティゲッターとセッターのオーバーライド

Swift 4では、ユーザーがカスタムgetterおよびsetterを提供して、継承されたプロパティが保存されたプロパティまたは計算されたプロパティであるかどうかをオーバーライドできます。 サブクラスは、継承されたプロパティの名前とタイプを知りません。 したがって、ユーザーがサブクラスで、スーパークラスで指定されたオーバーライドプロパティの名前とタイプを指定する必要があります。

これは2つの方法で行うことができます-

  • プロパティをオーバーライドするためにセッターが定義されている場合、ユーザーはゲッターも定義する必要があります。
  • 継承されたプロパティゲッターを変更したくない場合は、継承された値を構文 'super.someProperty’でスーパークラスに渡すだけです。
class Circle {
   var radius = 12.5
   var area: String {
      return "of rectangle for \(radius) "
   }
}

class Rectangle: Circle {
   var print = 7
   override var area: String {
      return super.area + " is now overridden as \(print)"
   }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("Radius \(rect.area)")

プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-

Radius of rectangle for 25.0  is now overridden as 3

プロパティオブザーバーのオーバーライド

継承されたプロパティに新しいプロパティを追加する必要がある場合、「プロパティオーバーライド」の概念がSwift 4で導入されます。 これは、継承されたプロパティ値が変更されたときにユーザーに通知します。 ただし、継承された定数保存プロパティおよび継承された読み取り専用の計算プロパティにはオーバーライドは適用されません。

class Circle {
   var radius = 12.5
   var area: String {
     return "of rectangle for \(radius) "
   }
}

class Rectangle: Circle {
   var print = 7
   override var area: String {
      return super.area + " is now overridden as \(print)"
   }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("Radius \(rect.area)")

class Square: Rectangle {
   override var radius: Double {
      didSet {
         print = Int(radius/5.0)+1
      }
   }
}

let sq = Square()
sq.radius = 100.0
print("Radius \(sq.area)")

プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-

Radius of rectangle for 25.0  is now overridden as 3
Radius of rectangle for 100.0  is now overridden as 21

オーバーライドを防止する最終プロパティ

ユーザーが他の人にスーパークラスのメソッド、プロパティ、または添え字へのアクセスを望まない場合、Swift 4はオーバーライドを防ぐために「最終」プロパティを導入します。 「最終」プロパティが宣言されると、サブスクリプトはスーパークラスのメソッド、プロパティ、およびそのサブスクリプトをオーバーライドできなくなります。 「スーパークラス」に「最終」プロパティを設定する規定はありません。 「最終」プロパティが宣言されると、ユーザーはさらにサブクラスを作成するように制限されます。

final class Circle {
   final var radius = 12.5
   var area: String {
      return "of rectangle for \(radius) "
   }
}

class Rectangle: Circle {
   var print = 7
   override var area: String {
      return super.area + " is now overridden as \(print)"
   }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("Radius \(rect.area)")

class Square: Rectangle {
   override var radius: Double {
      didSet {
         print = Int(radius/5.0)+1
      }
   }
}

let sq = Square()
sq.radius = 100.0
print("Radius \(sq.area)")

プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-

<stdin>:14:18: error: var overrides a 'final' var
override var area: String {
^
<stdin>:7:9: note: overridden declaration is here
var area: String {
^
<stdin>:12:11: error: inheritance from a final class 'Circle'
class Rectangle: Circle {
^
<stdin>:25:14: error: var overrides a 'final' var
override var radius: Double {
^
<stdin>:6:14: note: overridden declaration is here
final var radius = 12.5

スーパークラスは「final」として宣言され、そのデータ型も「final」として宣言されているため、プログラムはサブクラスをさらに作成できず、エラーがスローされます。