12.継承(継承)


クラスは、メソッド、Property、およびその他のプロパティを他のクラスから継承できます.クラスが他のクラスから継承される場合、継承されるクラスを子クラス(子クラス)と呼び、継承されるクラスを親クラス(superclass)と呼ぶ.sweeftでは、クラスは親クラスに属するメソッド、プロファイル、サブスクリプトにアクセスし、それらを変更するために再定義されたバージョンを提供します.

基本クラス


他のクラスから継承されていないクラスをベースクラス(basicclass)と呼びます.sweetでは、親を指定せずに定義されるクラスは自動基本クラスです.
class Vehicle {
	var currentSpeed = 0.0
    var description : String {
    	return "traveling at \(currentSpeed) miles per hour)"
    }
    
   	func makeNoise() {
    	// do nothing
    }
}
// 다음과 같이 일반적으로 메서드 프로퍼티를 소유한 가운데 선언된 클래스를 기본 클래스라고 한다.

サブクラス


既存のクラスを半分に対して新しいクラスを作成する操作.サブクラスは既存のクラスのプロパティを継承するため、変更できます.サブクラスのプロパティを追加することもできます.子クラスに親クラスのプロパティがあることを示すために、これをコロンに分割し、親クラスの名前を説明します.
class SomeSubClass : SomeSuperClass {
	//	하위 클래스 정의가 들어간다
}

class Bicycle : Vehicle {
	var hasBasket = false
}
// 이 새로운 클래스는 Vehicle 클래스를 상속하는 Bicycle이라는 하위 클래스를 정의한다.
//이 하위 클래스는 상위 클래스에 있는 currentSpeed, description 등의 프로퍼티와 
//makeNoise() 메서드 등의 모든 특성을 자동으로 소유하게 된다.

let bicycle = Bicycle()
bicycle.hasBasket = true
//다음과 같이 클래스 인스턴스를 생성 후 프로퍼티에 접근도 가능하다.

bicycle.currentSpeed = 15.0
//상속된 currentSpeed 프로퍼티를 수정할 수 있다.
//하위 클래스는 그 자체로 하위클래스화 가능하다.

class Tandem : Bicycle {
	var currentNumberOfPassenger = 0
}

//이 하위 클래스는 자전거 클래스를 다시 상속받는다.
//이 하위 클래스는 스스로의 상위 클래스인 Vehicle, Bicycle 두 클래스의 모든 프로퍼티, 메서드를 사용 가능해진다.

let tandem = Tandem()
tandem.hasBasket = true
tandem.currentNumberOfPassengers = 2
tandem.currentSpeed = 22.0
//다음과 같이 명시하지 않아도 전부 접근이 가능하다.

再定義(上書き)

  • サブクラスは、親から継承されたインスタンスメソッド、Property、およびタイプPropertyを含む独自のユーザ実装を提供する.継承するプロパティの前にoverrideキーを追加する場合は、再定義できます.
  • プレミアムクラスのメソッド、プログラム、およびサブスクリプトアクセスは、スーパープレフィックスによってプレミアムクラスのバージョンを実装することができる.例えば、someMethod()として再定義された方法は、再定義された方法の実施においてsuperである.親メソッドを実装するためにsomeMethod()を呼び出すことができます.somePropertyとして再定義されたPropertyは、getterおよびsetter実装でsuperである.親バージョンのsomePropertyにはsomePropertyからアクセスできます.
  • が継承するインスタンスまたはタイプメソッドを再定義することによって、サブクラスで代替インプリメンテーションをカスタマイズすることができる.
  • class Tarin : Vehicle {
    	override func makeNoise() {
        	print("CHOO CHOO")
        }
    }
    // 다음과 같이 새로운 인스턴스 생성 후 makeNoise메서드를 호출 히 Train하위 클래스 메서드가 호출된다.
    
     let train = Train()
     train.makeNoise()
     //추추! 를 출력한다.
     
  • プロトコルの再定義は再定義部分であり、setterを提供する際にgetterも提供しなければならない.再定義されたgetterで継承されたプロパティ値を変更したくない場合は、somePropertyで再定義されたプロパティ名にsuperとなります.継承値はsomePropertyで簡単に渡すことができます.
  • class Car : Vehicle {
    	var gear = 1
       	override var description : String {
        	return super.description + "in gear \(gear)"
        }
    }
    //여기에서 description 프로퍼티 재정의는 vehicle의 description 프로퍼티를 반환하는 
    //super.description호출로 시작한다. 그 다음 유저의 기어정보를 추가한다.
    
    let car  = Car()
    car.currentSpeed = 25.0
    var.gear = 3
    print("Car : \(car.description)")
    //다음과 같은 경우 25.0 마일과 3을 출력한다.기존 디스크립션에 추가한 문장을 출력하게 되는 것이다.
  • で継承されたpropertyにpropertyオブザーバを追加するには、propertyを使用して再定義できます.既存のインプリメンテーションが何であるかにかかわらず、property値を変更する通知を受け取ることができます.
  • class AutomaticCar : Car {
    	override var currentSpeed : Double {
        	didSet {
            	gear = Int(currentSpeed / 10.0) + 1
            }
        }
    }
    //여기에서 AutomaticCar인스턴스에 currentSpeed 프로퍼티를 설정할 때마다 
    //didSet관찰자는 새로운 속도에 적절한 기어를 인스턴스의 gear에 설정한다. 
    
    let automatic = Automatic()
    automatic.currentSpeed = 35.0
     // gear를 4로 설정하게 된다.
    finalキーワードにより
  • の再定義を防止できます.再定義を回避するには、メソッド、プロシージャ、サブスクリプトキーの前にfinalモディファイヤ(final var、final func、final class...)を作成します.サブクラスでfinalメソッドやpropertyなどを再定義するとエラーが発生します.クラス定義では、classの前にfinalキーを使用してfinalとして全体を表示できます.この場合、クラスを継承しようとするすべての試みがエラーになります.