2017-09-30 2 views
-1

Swift 3에서는 수퍼 클래스에서 기본 매개 변수를 상속하는 하위 클래스를 만들 수 있습니다. 예, :Swift 3에서는 하위 클래스가 수퍼 클래스의 기본값을 상속받을 수 있습니까?

class ParentClass { 
    let red: Double 

    init(red: Double = 1.0) { 
    self.red = red 
    } 
} 

class ChildClass: ParentClass { 
    let blue: Double 

    init(blue: Double = 2.0) { 
     self.blue = blue 
     super.init() 
    } 
} 
내가 ChildClass에의 인스턴스를 만들 수 있도록하고 싶습니다

나는 빨간색의 값을 지정하는 경우 (예를 들어, let foo = ChildClass(red: 10.0)) 나는이 값을 설정하지만 그때하지 않으면 그것의 수 있도록 값이 기본값이됩니다 (예 : let bar = ChildClass()bar.red = 1.0입니다).

이것이 가능합니까? 위의 방법은 효과가 없지만 개념적으로는 내가 원하는 것입니다. 또한 ChildClass에서 빨간색의 기본값을 다시 설정하지 않으려합니다 (수퍼 클래스 값의 절반을 무효화).

비슷하게 작동하는 구조 나 프로토콜을 사용하면 비슷한 것이 더 잘 수행됩니다.

감사합니다. 내가 제대로 이해하면

답변

0

이 작동 : 클래스의 인스턴스가 생성 될 때

class ParentClass { 
    let red: Double 

    init(red: Double = 1.0) { 
     self.red = red 
    } 
} 

class ChildClass: ParentClass { 
    let blue: Double 

    init(blue: Double = 2.0, red: Double? = nil) { 
     self.blue = blue 

     if let red = red { 
      super.init(red: red) 
     } else { 
      super.init() 
     } 
    } 
} 
0

당신은 모든 속성을 초기화해야합니다. 처럼 사실 ChildClass은 다음과 같습니다 init(red:)를 호출 할 때 var blue: Double가 초기화되지 않을 것 init(red:) 때문이 아니다

class ChildClass: ParentClass { 
    let blue: Double 

    init(blue: Double = 2.0) { 
     self.blue = blue 
     super.init(red: <#defaultValue#>) <-- default initializer 
    } 
} 

.

서브 클래스에서 init(red:)을 사용하려면 모든 속성이 초기화되어야합니다. 다음과 같이 시도해보세요.

class ParentClass { 
    var red: Double 
    init() { 
     self.red = 1.0 
    } 

    convenience init(red: Double) { 
     self.init() 
     self.red = red 
    } 
} 

class ChildClass: ParentClass { 
    var blue: Double 
    override init() { 
     self.blue = 2.0 
     super.init() 
    } 

    convenience init(blue: Double) { 
     self.init() 
     self.blue = blue 
    } 
} 
관련 문제