javascript 多態

var PersonPojo = function(){
    
    // 定義私有域(即成員變量)
     var name = "佚名" ;   // 姓名
     var age =   18   ;   // 年齡
     var sex = "男" ;   // 性別
    
    // 姓名取值方法
     this.getName = function() {
      return name;
     };
    // 姓名賦值方法
     this.setName = function(n) {
      name = n;
     };
    // 年齡取值方法
     this.getAge = function () {
      return age;
     };
    // 年齡賦值方法
     this.setAge = function(a) {
      age = a;
     };
    // 性別取值方法
     this.getSex = function() {
      return sex;
     };
    // 性別賦值方法
     this.setSex = function(s) {
      sex = s;
     };
    
    // 自我介紹的方法
     this.selfIntro = function() {
      alert("我是一個名字叫"
       + this.getName() + ",年齡爲"
       + this.getAge() + "的"
       + this.getSex() + "人!");
     };
    
    }
  
    /**
    * 學員Pojo類(作爲本演示中的派生類(或稱子類)角色出場)
    * 演示OOP在JavaScript中多態的書寫方式
    * By CodingMouse
    */
    var StudentPojo = function(){
   
    // 自我介紹的方法(覆蓋父類PersonPojo的selfIntro方法)
     this.selfIntro = function() {
      alert("我是一個名字叫"
       + this.getName() + ",年齡爲"
       + this.getAge() + "的"
       + this.getSex() + "學員!");
     };
    
    }
   
   /**
    * 教員Pojo類(作爲本演示中的派生類(或稱子類)角色出場)
    * 演示OOP在JavaScript中多態的書寫方式
    * By CodingMouse
    */
    var TeacherPojo = function() {
   
    // 自我介紹的方法(覆蓋父類PersonPojo的selfIntro方法)
     this.selfIntro = function() {
    
     // JavaScript中是使用arguments對象(可變參數,實現方法重載的關鍵點)來實現重載機制的
      alert("我是一個名字叫"
       + this.getName() + ",年齡爲"
       + this.getAge() + "的"
       + this.getSex() + "教員"
       + (arguments.length == 1 ? (",主講" + arguments[0] + "課程") : "")
       + "!");
     
     };
   
    }
   
   /**
    * 使用StudentPojo/TeacherPojo原型(prototype)方式呼叫PersonPojo出場,
    * 通過指定prototype,你就可以在StudentPojo/TeacherPojo類中如同在Java中呼叫父
    * 類的方式調用父類的公共域。此處可以理解爲如同在Java中使用extends
    * 關鍵字通知編譯器StudentPojo/TeacherPojo類要繼承PersonPojo類。
    */
    StudentPojo.prototype = new PersonPojo();
    TeacherPojo.prototype = new PersonPojo();
   
   /**
    * 關鍵點:打招呼的演示方法 - 利用多態特性呼叫自我介紹方法
    *(演示多態,由子類去呼叫父類方法,父類方法自動調用被子類覆蓋過的同名方法)
    * 使用父類類型的引用指向子類的對象。
    */
    function SayHello(intro) {
   
     // 判斷實參是否是PersonPojo的一個實例
     if (intro instanceof PersonPojo) {
      // 調用自我介紹方法(編譯器會自動獲取被覆蓋過的子類方法並調用)
      intro.selfIntro();
     }
    
    }
   
   // 測試程序主方法
    function main(){
   
    // 創建一個學員實例並設置屬性(演示方法覆蓋/重寫)
     var stu = new StudentPojo();
     stu.setName("張三");
     stu.setAge(21);
     stu.setSex("男");
     // 創建一個教員實例並設置屬性(演示方法覆蓋/重寫)
     var tea = new TeacherPojo();
     tea.setName("周七");
     tea.setAge(26);
     tea.setSex("女");
    // 創建另一個教員實例並設置屬性(演示方法重載)
     var tea2 = new TeacherPojo();
     tea2.setName("周七");
     tea2.setAge(26);
     tea2.setSex("女");
    
    /**
     * 關鍵點:利用多態特性呼叫自我介紹方法
     *(演示多態,由子類去呼叫父類方法,父類方法自動調用被子類覆蓋過的同名方法)
     * 使用父類類型的引用指向子類的對象。
     */
     SayHello(stu);
     SayHello(tea);
     tea2.selfIntro("Java"); // 演示方法重載
   
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章