diff --git a/source/chapter2/13_Inheritance.md b/source/chapter2/13_Inheritance.md index 3ab4e7a4..fc2f5918 100755 --- a/source/chapter2/13_Inheritance.md +++ b/source/chapter2/13_Inheritance.md @@ -11,11 +11,11 @@ - [重写(Overriding)](#overriding) - [防止重写](#preventing_overrides) -一个类可以*继承(inherit)*另一个类的方法(methods),属性(property)和其它特性。当一个类继承其它类时,继承类叫*子类(subclass)*,被继承类叫*超类(或父类,superclass)*。在 Swift 中,继承是区分「类」与其它类型的一个基本特征。 +一个类可以*继承(inherit)*另一个类的方法(methods),属性(properties)和其它特性。当一个类继承其它类时,继承类叫*子类(subclass)*,被继承类叫*超类(或父类,superclass)*。在 Swift 中,继承是区分「类」与其它类型的一个基本特征。 在 Swift 中,类可以调用和访问超类的方法,属性和下标脚本(subscripts),并且可以重写(override)这些方法,属性和下标脚本来优化或修改它们的行为。Swift 会检查你的重写定义在超类中是否有匹配的定义,以此确保你的重写行为是正确的。 -可以为类中继承来的属性添加属性观察器(property observer),这样一来,当属性值改变时,类就会被通知到。可以为任何属性添加属性观察器,无论它原本被定义为存储型属性(stored property)还是计算型属性(computed property)。 +可以为类中继承来的属性添加属性观察器(property observers),这样一来,当属性值改变时,类就会被通知到。可以为任何属性添加属性观察器,无论它原本被定义为存储型属性(stored property)还是计算型属性(computed property)。 ## 定义一个基类(Base class) @@ -27,7 +27,7 @@ Swift 中的类并不是从一个通用的基类继承而来。如果你不为 下面的例子定义了一个叫`Vehicle`的基类。这个基类声明了一个名为`currentSpeed `,默认值是0.0的存储属性(属性类型推断为`Double `)。`currentSpeed `属性的值被一个`String` 类型的只读计算型属性`description`使用,用来创建车辆的描述。 -`Vehicle`基类也定义了一个名为`makeNoise`的方法。这个方法实际上不为`Vehicle`实例做任何事,但之后将会被`Vehicle`的子类定制 +`Vehicle`基类也定义了一个名为`makeNoise`的方法。这个方法实际上不为`Vehicle`实例做任何事,但之后将会被`Vehicle`的子类定制: ```swift class Vehicle { @@ -41,7 +41,7 @@ class Vehicle { } ``` -您可以用初始化语法创建一个`Vehicle `的新实例,即 `TypeName`后面跟一个空括号: +您可以用初始化语法创建一个`Vehicle `的新实例,即类名后面跟一个空括号: ```swift let someVehicle = Vehicle() ``` @@ -51,7 +51,9 @@ let someVehicle = Vehicle() ```swift println("Vehicle: \(someVehicle.description)") // Vehicle: traveling at 0.0 miles per hour -``` +``` + +`Vehicle`类定义了一个通用特性的车辆类,实际上没什么用处。为了让它变得更加有用,需要改进它能够描述一个更加具体的车辆类。 ## 子类生成(Subclassing) @@ -66,17 +68,13 @@ class SomeClass: SomeSuperclass { } ``` -下一个例子,定义一个更具体的车辆类叫`Bicycle`。这个新类是在 `Vehicle`类的基础上创建起来。因此你需要将`Vehicle`类放在 `Bicycle`类后面,用冒号分隔。 - -我们可以将这读作: - -“定义一个新的类叫`Bicycle `,它继承了`Vehicle`的特性”; - +下一个例子,定义一个叫`Bicycle`的子类,继承成父类`Vehicle` + ```swift class Bicycle: Vehicle { var hasBasket = false } -``` +``` 新的`Bicycle`类自动获得`Vehicle`类的所有特性,比如 `currentSpeed `和`description`属性,还有它的`makeNoise`方法。 @@ -161,7 +159,7 @@ train.makeNoise() ### 重写属性 -你可以重写继承来的实例属性或类属性,提供自己定制的getter和setter,或添加属性观察器使重写的属性观察属性值什么时候发生改变。 +你可以重写继承来的实例属性或类属性,提供自己定制的getter和setter,或添加属性观察器使重写的属性可以观察属性值什么时候发生改变。 #### 重写属性的Getters和Setters @@ -228,7 +226,7 @@ println("AutomaticCar: \(automatic.description)") 你可以通过把方法,属性或下标脚本标记为*`final`*来防止它们被重写,只需要在声明关键字前加上`final`特性即可。(例如:`final var`, `final func`, `final class func`, 以及 `final subscript`) -如果你重写了`final`方法,属性或下标脚本,在编译时会报错。在扩展中,你添加到类里的方法,属性或下标脚本也可以在扩展的定义里标记为 final。 +如果你重写了`final`方法,属性或下标脚本,在编译时会报错。在类扩展中的方法,属性或下标脚本也可以在扩展的定义里标记为 final。 -你可以通过在关键字`class`前添加`final`特性(`final class`)来将整个类标记为 final 的,这样的类是不可被继承的,否则会报编译错误。 +你可以通过在关键字`class`前添加`final`特性(`final class`)来将整个类标记为 final 的,这样的类是不可被继承的,任何子类试图继承此类时,在编译时会报错。