최고의 스위프트 상속 튜토리얼 2024년, 이 튜토리얼에서는 기본 클래스,아강,다시 쓰기 (재정),메서드 및 속성 재정의,재정의 속성 뷰어,방지 재 작성,를 배울 수 있습니다.
상속은 우리가 다른 클래스의 메서드와 속성을 얻을 클래스로 이해 될 수있다.
클래스가 다른 클래스에서 상속하는 경우, 상속 클래스는 서브 클래스, 상속 클래스라는 슈퍼 클래스 (또는 부모)라고
스위프트에서, 클래스는 호출하고 슈퍼 클래스의 메소드, 속성 및 첨자 스크립트에 액세스하고이를 대체 할 수있다.
우리는 또한 클래스의 속성 관찰자 상속 된 속성을 추가 할 수 있습니다.
다른 클래스가 클래스를 상속하지, 기본 클래스 (기본 클래스)로 전화하십시오.
다음의 예는, 우리는 학생 (stname) 및 모든 주제 점수 (MARK1, MARK2, mark3)에 대해 설명, 기본 클래스 StudDetails을 정의합니다 :
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" let mark1 = 98 let mark2 = 89 let mark3 = 76 print(stname) print(mark1) print(mark2) print(mark3)
위의 프로그램 실행 출력은 다음과 같습니다
swift 98 89 76
swift 98 89 76
서브 클래스는 기존 클래스를 기반으로 새 클래스를 만드는 것입니다을 의미한다.
클래스의 슈퍼 클래스를 지정하려면, 서브 클래스 이름의 뒷면에 기록 된 슈퍼 클래스 이름은 (:) 콜론으로 구분 된 구문은 다음과 같다
class SomeClass: SomeSuperclass { // 类的定义 }
다음 예, 우리는 슈퍼 클래스 StudDetails을 정의하고 톰을 상속 서브 클래스 :
class StudDetails { var mark1: Int; var mark2: Int; init(stm1:Int, results stm2:Int) { mark1 = stm1; mark2 = stm2; } func show() { print("Mark1:\(self.mark1), Mark2:\(self.mark2)") } } class Tom : StudDetails { init() { super.init(stm1: 93, results: 89) } } let tom = Tom() tom.show()
위의 프로그램 실행 출력은 다음과 같습니다
Mark1:93, Mark2:89
서브 클래스는 우리가 (재정의) 다시이 문제를 호출, 자신의 사용자 정의 기능을 실현하기 인스턴스 메소드, 클래스 메소드, 인스턴스, 속성 또는 첨자 스크립트를 상속 할 수 있습니다.
우리는 재 작성을 달성하기 위해 override 키워드를 사용할 수 있습니다.
이 방법은 당신이 접두사에게 슈퍼 슈퍼 클래스, 속성 또는 아래 첨자 스크립트에 액세스하는 데 사용할 수 있습니다.
고쳐 쓰기 | 액세스 메서드, 속성, 첨자 스크립트 |
---|---|
방법 | super.somemethod () |
재산 | super.someProperty () |
첨자 스크립트 | 슈퍼 [someIndex] |
우리의 서브 클래스에서, 우리는 슈퍼 클래스의 메소드를 오버라이드 (override) 할 override 키워드를 사용할 수 있습니다.
다음의 예는, 우리는 쇼 () 메소드를 재 작성 :
class SuperClass { func show() { print("这是超类 SuperClass") } } class SubClass: SuperClass { override func show() { print("这是子类 SubClass") } } let superClass = SuperClass() superClass.show() let subClass = SubClass() subClass.show()
위의 프로그램 실행 출력은 다음과 같습니다
这是超类 SuperClass 这是子类 SubClass
당신은 속성이 저장 유형 또는 재산의 컴퓨팅 유형의 상속 여부, 상속 재산을 다시 작성하는 사용자 정의 게터 (또는 세터)를 제공 할 수 있습니다.
서브 클래스가 상속 된 속성이 저장 유형 또는 계산의 유형을 알고하지 않습니다, 그것은 단지 상속 된 속성은 이름과 유형이있을 것이다 알고있다. 그래서 당신은 속성을 재 작성, 그것은 적어 이름을 입력 할 필요가있다.
주의 사항 :
이 속성을 재 작성에 세터를 제공하는 경우에, 당신은 게터를 제공해야합니다.
당신이 상속 된 속성 값을 수정하는 게터 재 버전을하지 않으려는 경우 상속 된 값 someProperty 당신이 속성을 재정의 할 이름입니다 super.someProperty에 직접 반환 할 수 있습니다.
우리는 슈퍼 클래스 원과 사각형의 서브 클래스를 정의하는 다음의 예는, 우리는 사각형 클래스 속성 영역을 다시 작성 :
class Circle { var radius = 12.5 var area: String { return "矩形半径 \(radius) " } } // 继承超类 Circle class Rectangle: Circle { var print = 7 override var area: String { return super.area + " ,但现在被重写为 \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 print("Radius \(rect.area)")
위의 프로그램 실행 출력은 다음과 같습니다
Radius 矩形半径 25.0 ,但现在被重写为 3
당신은 다시 쓰기에서 관찰 된 특성의 속성을 상속하는 속성을 추가 할 수 있습니다. 상속 된 속성 값이 변경은 사용자가 모니터링 할 결과,.
참고 : 상속 된 유형의 속성 옵저버를 추가 할 수 없습니다 상수 메모리 또는 읽기 전용 계산 상속 재산 때문이다.
class Circle { var radius = 12.5 var area: String { return "矩形半径为 \(radius) " } } class Rectangle: Circle { var print = 7 override var area: String { return super.area + " ,但现在被重写为 \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 print("半径: \(rect.area)") class Square: Rectangle { override var radius: Double { didSet { print = Int(radius/5.0)+1 } } } let sq = Square() sq.radius = 100.0 print("半径: \(sq.area)")
半径: 矩形半径为 25.0 ,但现在被重写为 3 半径: 矩形半径为 100.0 ,但现在被重写为 21
우리는 마지막 키워드가 덮어 쓰기되는 것을 방지 할 수 있습니다.
당신은 컴파일시 에러에 마지막 방법, 재산, 또는 아래 첨자 스크립트를 오버라이드 (override)하는 경우.
전체 클래스에 키워드 클래스 특성 (최종 클래스) 최종 표시되기 전에 클래스는 상속 될 수 없습니다, 그래서 그렇지 않으면 컴파일 오류가보고되며, 최종를 추가 할 수 있습니다.
final class Circle { final var radius = 12.5 var area: String { return "矩形半径为 \(radius) " } } class Rectangle: Circle { var print = 7 override var area: String { return super.area + " ,但现在被重写为 \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 print("半径: \(rect.area)") class Square: Rectangle { override var radius: Double { didSet { print = Int(radius/5.0)+1 } } } let sq = Square() sq.radius = 100.0 print("半径: \(sq.area)")
때문에 위의 예에 최종 키워드를 재 작성 할 수 없습니다, 그래서 실행이 주어집니다 사용
error: var overrides a 'final' var override var area: String { ^ note: overridden declaration is here var area: String { ^ error: var overrides a 'final' var override var radius: Double { ^ note: overridden declaration is here final var radius = 12.5 ^ error: inheritance from a final class 'Circle' class Rectangle: Circle { ^