2017-09-30 3 views
-1

Swift 3では、スーパークラスからデフォルトのパラメータを継承するサブクラスを作成することができます。例えば,:私は(let foo = ChildClass(red: 10.0)、例えば)の赤の値を指定して、このような場合、そのChildClassのインスタンスを作成できるようにしたいと思い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() 
    } 
} 

その後、私はその値を設定することができますが、私がいない場合、それはです値がデフォルトになります(たとえば、let bar = ChildClass()bar.red = 1.0になります)。

これは可能ですか?上記は機能しませんが、概念的には私が望むものです。さらに、ChildClassでredのデフォルト値を再び設定したくない(スーパークラスの半分の値を破る)。

類似のものが、同様に機能する構造またはプロトコルでうまく達成された場合。

ありがとうございます!

答えて

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

クラスのインスタンスが作成されるときは、すべてのプロパティを初期化する必要があります。

class ChildClass: ParentClass { 
    let blue: Double 

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

init(red:)が呼び出されたときにvar blue: Doubleが初期化されませんので、init(red:)はありません。あるように実際にChildClassです。

サブクラスで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 
    } 
} 
関連する問題