源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

解析Swift语言面相对象编程中的继承特性

  • 时间:2020-08-01 16:59 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:解析Swift语言面相对象编程中的继承特性
取大于形态的能力被定义为继承。一般一个类可以从另一个类继承属性和方法。类可以进一步划分到子类和超类。 子类:当一个类从另一个类继承属性,方法和功能被称为子类 超类:类包含属性,方法和功能被其它类继承称为超类 Swift 中类包含父类和调用访问方法,属性,功能和重写方法。另外,属性观察者也用于添加属性和修改所存储的或计算的特性的方法。 [b]基类 [/b]一个类如果不从其它类继承方法,属性或功能,那么它被称为“基类”。
[u]复制代码[/u] 代码如下:
classStudDetails{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 =98let mark2 =89let mark3 =76 println(stname) println(mark1) println(mark2) println(mark3)
当我们使用 playground 运行上面的程序,得到以下结果。
swift
98
89
76
这里 StudDetails 类被定义为基类,它用于包含学生名字和三个科目标记为:mark1, mark2 和 mark3. 'let'关键字在 playground 中初始化并使用 “println” 函数打印显示基础类的值。 子类 在现有的基类上定义一个新的类就叫作“子类”。子类继承了其基类的属性,方法和功能。要定义一个子类使用 “ : ” 在基类名称前。
[u]复制代码[/u] 代码如下:
classStudDetails{var mark1:Int;var mark2:Int;         init(stm1:Int, results stm2:Int){         mark1 = stm1;         mark2 = stm2;}         func print(){         println("Mark1:\(mark1), Mark2:\(mark2)")}}class display :StudDetails{     init(){super.init(stm1:93, results:89)}}let marksobtained = display() marksobtained.print()
当我们使用 playground 运行上面的程序,得到以下结果。
Mark1:93, Mark2:89
“StudDetails” 类定义为学生标记声明的超类以及子类的 'display' 从它的超类继承以打的标记。子类定义学生标记和调用打印方法来显示学生的标志。 [b]覆盖/重写 [/b]访问超类的实例,类型方法,例如,类型属性和下标子类提供覆盖的概念。 'override' 关键字用来覆盖超类中声明的方法。 [b]访问超级类的方法,属性和下标 [/b]“super”关键字作为前缀用来访问超类中声明的方法,属性和下标。 [img]http://files.jb51.net/file_images/article/201511/2015115151431204.png?2015105151443[/img] [b]方法和属性覆盖 方法覆盖 [/b]继承实例和类型的方法可以通过 'override' 关键字覆盖在子类中定义的方法。在这里,在子类中重写打印来访问超类打印type属性。
[u]复制代码[/u] 代码如下:
class cricket {     func print(){         println("Welcome to Swift Super Class")}}class tennis: cricket  {override func print(){         println("Welcome to Swift Sub Class")}}let cricinstance = cricket() cricinstance.print()let tennisinstance = tennis() tennisinstance.print()
当我们使用 playground 运行上面的程序,得到以下结果。
Welcome to Swift Super Class
Welcome to Swift Sub Class
[b]属性重写 [/b]可以覆盖继承的实例或类属性来提供自定义的getter和setter 属性,或添加属性观察者,当下层属性值更改时以使重写属性到观察者。 重写属性getter和setter Swift 允许用户提供自定义 getter和setter 覆盖继承的属性,无论是存储还是计算属性。子类不知道继承的属性名称和类型。因此,至关重要的是,用户需要在子类中指定,名称和在超类中指定重写属性的类型。 这可以通过两种方式来完成: 当 setter 被定义为重写属性,用户必须也要定义 getter。 当我们不希望修改继承属性的getter,我们可以通过简单的语法“super.someProperty”来给超类继承值。
[u]复制代码[/u] 代码如下:
classCircle{var radius =12.5var area:String{return"of rectangle for \(radius) "}}classRectangle:Circle{varprint=7overridevar area:String{returnsuper.area +" is now overridden as \(print)"}}let rect =Rectangle() rect.radius =25.0 rect.print=3 println("Radius \(rect.area)")
当我们使用 playground 运行上面的程序,得到以下结果。
Radius of rectangle for 25.0 is now overridden as 3
[b]重写属性观察者 [/b]当一个新的属性需要为继承的属性被添加,在 Swift 中推出 “属性重写” 的概念。通知用户当继承属性值被更改。但重写不适用于继承的常量存储属性和继承只读计算属性。
[u]复制代码[/u] 代码如下:
classCircle{var radius =12.5var area:String{return"of rectangle for \(radius) "}}classRectangle:Circle{varprint=7overridevar area:String{returnsuper.area +" is now overridden as \(print)"}}let rect =Rectangle() rect.radius =25.0 rect.print=3 println("Radius \(rect.area)")classSquare:Rectangle{overridevar radius:Double{         didSet {print=Int(radius/5.0)+1}}}let sq =Square() sq.radius =100.0 println("Radius \(sq.area)")
当我们使用 playground 运行上面的程序,得到以下结果。
Radius of rectangle for 25.0 is now overridden as 3
Radius of rectangle for 100.0 is now overridden as 21
[b]最终属性以防止重写 [/b]当用户不需要让别人访问超类的方法,属性或下标,Swift 引入“final”属性,以防止覆盖。 当 “final” 属性被声明后,将不允许超类的方法,属性和下标被覆盖。在超类不可以有 'final' 。当 “final” 属性被声明后,用户限制子类创建。
[u]复制代码[/u] 代码如下:
 finalclassCircle{finalvar radius =12.5var area:String{return"of rectangle for \(radius) "}}classRectangle:Circle{varprint=7overridevar area:String{returnsuper.area +" is now overridden as \(print)"}}let rect =Rectangle() rect.radius =25.0 rect.print=3 println("Radius \(rect.area)")classSquare:Rectangle{overridevar radius:Double{         didSet {print=Int(radius/5.0)+1}}}let sq =Square() sq.radius =100.0 println("Radius \(sq.area)")
当我们使用 playground 运行上面的程序,得到以下结果。
[u]复制代码[/u] 代码如下:
<stdin>:14:18: error: var overrides a 'final' var     override var area: String {                  ^ <stdin>:7:9: note: overridden declaration is here     var area: String {         ^ <stdin>:12:11: error: inheritance from a final class 'Circle'     class Rectangle: Circle {           ^ <stdin>:25:14: error: var overrides a 'final' var override var radius: Double {              ^ <stdin>:6:14: note: overridden declaration is here    final var radius = 12.5
当超类声明为 “final”和数据类型也被宣明为'final',程序将不允许再创建子类,否则它会引发错误。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部