Latest web development tutorials

스위프트 상속

상속은 우리가 다른 클래스의 메서드와 속성을 얻을 클래스로 이해 될 수있다.

클래스가 다른 클래스에서 상속하는 경우, 상속 클래스는 서브 클래스, 상속 클래스라는 슈퍼 클래스 (또는 부모)라고

스위프트에서, 클래스는 호출하고 슈퍼 클래스의 메소드, 속성 및 첨자 스크립트에 액세스하고이를 대체 할 수있다.

우리는 또한 클래스의 속성 관찰자 상속 된 속성을 추가 할 수 있습니다.


기본 클래스

다른 클래스가 클래스를 상속하지, 기본 클래스 (기본 클래스)로 전화하십시오.

다음의 예는, 우리는 학생 (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 {
      ^