`

继承(Inheritance)

阅读更多

4.1 继承的概念

继承的定义:继承是一个类可以获得另一个类的特性的机制,继承支持层次概念
继承是一种代码重用的形式,允许程序员基于现有类开发新类。现有类通常称为"基类"或"超类",新类通常称为"类"或"派生类"。通过继承还可以在代码中利用多态。
继承的好处:继承最大的好处是代码的重用,与它同样重要的是它带来了多态。关于多态后面会给大家非常详细的讲解,我们现在只讨论继承。
     AS 3 和 Java 一样都是单根继承的。在 AS 3 中不论哪个类都有一个相同的唯一的老祖宗 —— Object。拿我们最熟悉的 Sprite 类来说,查看一下帮助文档:


包 flash.display
类 public class Sprite
继承 Sprite→DisplayObjectContainer→InteractiveObject→DisplayObject→EventDispatcher→Object
子类  FLVPlayback, FLVPlaybackCaptioning, MovieClip, UIComponent

 

    从这里可以清楚地看到,Sprite 的父类是 DisplayObjectContainer,而 DisplayObjectContainer 的父类是 InteractiveObject。一直往下找,最终都能够找到 Object类,不仅是 Sprite,所有的类皆如此,这就叫单根继承。AS 单根继承的思想应该说是从 Java 借鉴来的,实践证明单根继承取得了很大的成功。Java 发明的单根继承摒弃了 C++ 的多继承所带来的很多问题。

    虽然在 AS 3 中不能直接利用多继承,但是可以通过实现多个接口(interface)达到相同的目的,关于接口后面会单独讲解。单继承和多继承相比,无非多敲些代码而已,但是它带来的巨大好处是潜移默化的。具体有哪些好处这里就不详细讨论了,总之是非常非常多,大家如果有兴趣可以到网上搜索一下相关内容。

    我们知道 Sprite 类有 x 和 y 属性,现在请大家在帮助文档中查找出 Sprite 类的这两个属性。你一定是先去打开 Sprite 这个类,但只看到五个属性,里面没有我没要找到 x, y 属性!怎么回事?这时候应该首先想到的是继承,一定是它的父类里面有,这两个属性是从父类中继承过来的!OK,没错,就是这样,那么就去 DisplayObjectContainer 找找,可是还没找到,再找父类的父类 InteractiveObject 还没有,再找父类的父类的父类 DisplayObject 找到了吧。学会查帮助文档非常重要,知道某个类有某个属性或方法,如果在这个类中找不到就要去它的父类中去找,再找不到就去父类的父类中找,最远到 Object 不信你找不到。

 

 

 

4.2 TestPerson.as —— 属性与方法的继承

package {
     public class TestStudent {
          public function TestPerson() {
              var student:Student = new Student();
              student.name = "ZhangSan";
              student.age = 18;
              student.school = "114";
              trace(student.name, student.age, student.school);
          }
      }
}
class Person {
    private var _name:String;
    private var _age:int;
 
    public function get name():String{
         return _name;
    }
    public function set name(n:String):void {
       if (n == "") {
         trace("name 不能为空!");
         return;
       }
       _name = n;
    }
 
    public function get age():int {
       return _age;
    }
    public function set age(a:int):void {
       if (a < 0) {
          trace("age 不能小于 0!");
          return;
       }
       _age = a;
    }
} 
class Student extends Person {
     private var _school:String;
 
     public function get school():String {
         return _school;
     }
 
     public function set school(s:String):void {
         _school = s;
     }
}

 

     注意,package 中包的是用来测试的类,为了演示方便Person 和 Student 跟这个测试类放在了一个 as 文件中。
    首先定义一个 Person 类,人都有名字(name)和年龄(age),下面让 Student 类继承 Person 类,也就是说学生继承了人的所有特性,或者说“学生是一个人”,这话没错吧! “Student is a Person”,满足 is-a,那么就可以使用继承。Student 在 Person 的基础上还多出了 school 属性,记录着他所在学校的名称。
    在测试类中创建了一个 Student 对象,使用 student.name, student.age, student.school,设置学生的姓名,年龄和学校。虽然 Student 类中没有定义 name, age 属性,但这两个属性是它从父类 Person 继承而来的,因此实现了代码的复用,因此 Student 也就拥有了父类属性和方法。

 

 

4.3 TestExtends.as —— 继承的限制

package {
     public class TestExtends {
          public function TestExtends() {
              new Son();
          }
     }
}

class Father {
     private var money:int = 1000000;
     public var car:String = "BMW";
     private function work():void {
          trace("writing");
     }
}

class Son extends Father {
      public var bike:String = "YongJiu";
      // 没有继承因此谈不上重写
      private function work():void {
          trace("studying");
      };
 
      function Son (){
         trace(bike);
         trace(car);
         //trace(money); // private 的属性不能被继承
      work();
      }
}

 
       这个例子要演示哪些属性或方法不能被继承。本例中定义了一个 Father 类,其中包括 private 的money 属性,public 的 car 属性和 private 的 work() 方法。
        然后定义一个 Son 类继承自 Father 类,在 Son 类中新增加一个 bike 属性,同样也有一个 work() 方法。在 Son 的构造函数中打印出 bike, car属性或调用 work() 方法都没问题。但是不能打印出 money 属性,因为它是 Father 类私有的,回想一下第三节所讲的“访问控制”查一下那个表,可以看到 private 的成员只能在类内访问,不能被继承。那么父类中还有一个 work() 方法也是 private 的,因此也不会被继承,所以在子类中再定义一个 work() 方法也不会有冲突,也就谈不上重写。关于重写,后面还有相关的例子。
    学习 OOP 编程时,如果可以理解程序执行时内存的结构,那将对我们学习 OOP 编程有莫大好处。下面就来了解一下内存的结构以及各部分的作用。

分享到:
评论

相关推荐

    关于面向对象的哲学体系及科学体系的探讨(PDF)

    用中国式思维理解面向对象,pdf格式,内容包含:目彔 Catelog序言 Perface真经第一章:世界 Waltanschauung真经第二章:抽象 Abstraction真经第三章:层次 Arrangement真经第四章:继承 Inheritance真经第亐章:...

    类的继承练习_inheritance_类的继承练习_C++_pineoce_

    在C++编程语言中,类的继承是面向对象编程(OOP)的一个核心概念,它允许我们创建一个新类(子类或派生类),该类不仅拥有已存在的类(父类或基类)的特性,还能添加新的特性和功能。这种机制有助于代码重用,降低...

    inheritance

    【标题】"inheritance"指的是在编程领域中的继承机制,特别是在面向对象编程(OOP)的概念中。继承是面向对象编程的一个核心特性,允许一个类(子类或派生类)从另一个类(父类或基类)继承属性和方法。这种设计模式...

    Inheritance

    《继承在Java编程中的应用与理解》 继承是面向对象编程中的核心概念之一,它允许开发者从已有的类(父类或超类)派生出新的类(子类或派生类),以此来实现代码的复用和扩展。在Java编程语言中,继承通过关键字`...

    大数据必学Java基础(四十):面向对象三大特性之一继承(Inheritance)

    本篇将详细讲解Java中的继承(Inheritance)及其相关知识点。 一、继承的概念与优势 1. 类是对对象的抽象:在Java中,类是创建对象的模板,它封装了数据(属性)和行为(方法)。例如,手机类可以抽象出荣耀20、...

    JAVA基础之继承(inheritance)详解

    在Java面向对象编程(OOP)中,继承(Inheritance)是实现代码重用和抽象化的重要机制。它允许一个类(子类)从另一个类(超类、基类、父类)继承特性,包括方法和字段。继承使得子类能够获取父类的功能,同时还能...

    inheritance---derived-class.rar_inheritance

    在C++编程语言中,继承(Inheritance)是面向对象编程的一个核心概念,它允许一个类(称为子类或派生类)从另一个类(称为基类或父类)继承特性。这种特性使得代码重用变得简单,同时也能实现多态性。"inheritance--...

    Advanced JavaScript (closures,prototype,inheritance)

    JavaScript,作为一种广泛应用于Web开发的脚本语言,其高级特性如闭包(closures)、原型(prototype)和继承(inheritance)是理解其精髓的关键。本文将深入探讨这些概念,帮助开发者更好地掌握JavaScript的核心。 ...

    c++程序设计 继承与派生实验(二)

    继承方式主要有三种:公有继承(public inheritance)、私有继承(private inheritance)和保护继承(protected inheritance)。在公有继承下,基类的公有和保护成员在派生类中保持相同访问级别;私有继承则使基类的...

    c++继承与派生

    * 公有继承(public inheritance):基类的所有成员都可以被派生类访问。 * 私有继承(private inheritance):基类的所有成员都不能被派生类访问。 * 保护继承(protected inheritance):基类的保护成员可以被派生...

    C 程序设计教学课件:CHAPTER 8 INHERITANCE.ppt

    7. **8.7 Virtual Inheritance** - 虚继承(Virtual Inheritance)用于解决多重继承中的菱形问题,确保基类的同一成员在派生类中只有一个实例。 在实际编程中,理解并灵活运用这些概念对于构建高效、可维护的C++...

    JavaScript学习之三 — JavaScript实现继承的7种方式

    1. 原型链继承(Prototype Chain Inheritance) 原型链是JavaScript实现继承的基础。每个函数都有一个`prototype`属性,这个属性是一个对象,它的`__proto__`属性指向创建该函数的构造函数的原型。当试图访问一个...

    C程序设计教学课件:CHAPTER8INHERITANCE.pptx

    在CHAPTER8INHERITANCE.pptx中,主要讲解了C++中的继承及其相关知识点。 8.1 引入 继承的主要目的是促进代码重用和表达程序组件之间的自然关系。例如,可以创建一个`Vehicle`基类,然后派生出如`Car`, `SaloonCar`,...

    用Hibernate映射继承关系

    Hibernate支持多种继承策略,包括单一表继承(Single Table Inheritance)、联合表继承( Joined Table Inheritance)和表-per类继承(Table per Class Inheritance)。每种策略都有其特定的适用场景和优缺点,下面...

    (2)Hibernate3.2 中的类继承关系

    在Hibernate 3.2中,类继承有多种策略,包括单表继承(Single Table Inheritance)、联合继承(Joined Table Inheritance)和Concrete Table Inheritance。这些策略各有优缺点,适用于不同的场景。 1. 单表继承...

    多重继承(6_7钻石继承问题)_C++_

    为了解决这个问题,C++引入了**虚拟继承(virtual inheritance)**的概念。在声明基类时,我们可以使用`virtual`关键字,比如`class B : virtual public A`,这样B就虚拟地继承了A。虚拟继承确保所有通过虚拟基类...

    jpa/hibernate继承注解

    这通常是默认的继承策略,不需要在父类上声明`@Inheritance`,但可以通过`@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)`明确指定。 4. **Hibernate 具体化类(Concrete Class)** Hibernate 允许在...

    14 继承(一)(整个继承树映射到一张表)

    1. **单表继承(Single Table Inheritance,STI)**:在STI中,所有类的实例都存储在一个表中。每个子类在数据库表中增加一个表示类类型的字段,例如`discriminator_column`。当查询时,Hibernate根据这个字段值决定...

Global site tag (gtag.js) - Google Analytics