程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Asp.Net Ajax 學習筆記11 Microsoft AJAX Library中的面向對象類型系統

Asp.Net Ajax 學習筆記11 Microsoft AJAX Library中的面向對象類型系統

編輯:.NET實例教程
注冊命名空間

命名空間在.Net中非常常見,為了避免類型沖突,並將類進行分類識別。在ASP.Net AJax中也有命名控件的概念,通過使用Type.registerNamespace("SpaceName") 來注冊一個命名空間。

2、類

類的構造函數就是function的定義。通常類的私有成員使用_開頭,但是這僅僅只是標識這個成員是私有的,不能做到真正的封裝,外部還是可以訪問當這個內部成員。類的內部成員不用聲明,直接可以在函數中使用。



MyNamespace.Employee = function(name)
...{
    this._name = name ? name : "[Anonymous]";
    this._year = 0;
}

上面這段代碼就是Employee類的構造函數。

定義類的方法:在ASP.Net AJax是,定義類的成員方法是基於prototype的定義



MyNamespace.Employee.prototype = 
...{
    get_name : function()
    ...{
        return this._name;
    },
    
    get_year : function()
    ...{
        return this._year;
    },
    set_year : function(value)
...{
        this._year = value;
    },
    
    calculateSalary : function()
    ...{
        throw Error.notImplemented();
    },
    
    getDescription : function()
    ...{
        return String.format(
            "{0} gets {1} yuan per month.",
            this._name,
            this.calculateSalary());
    }
}

如例所示,定義類的方法,需要使用命名空間名加類名加prototype,每個方法之間一定要用'',''分割。注意在JS中set_、get_開頭的方法作為一個類的屬性。

在定義完類和類的方法之後需要注冊類,使用NameSpace.ClassName.registerClass("NameSpace.ClassName")來注冊一個類,注意命名空間需要注冊在這個之前。

3、實現面向對象的特性-繼承

  • 抽象類:抽象類就是包含抽象方法的類,那麼在ASP.Net AJax中如何來表明一個抽象方法呢?那麼在實現類的方法的時候,不寫出方法的邏輯,直接拋出一個Error.notImplemented()錯誤,如上例calculateSalary 方法就是一個抽象方法。
  • 繼承:如果一個類繼承了另一個類,那麼必須調用基類的構造函數,否則會丟失繼承效果。

    nameSpace.DividedClass = function()
    ...{
        nameSpace.DividedClass.initializeBase(this, [param1, ...]);
  • 注冊派生類:在注冊類時,需要加上基類的名作為第二個參數來表明派生類和基類之間的繼承關系nameSpace.DividedClass.registerClass("nameSpace.DividedClass", BaseClassNameSpace.BaseClass);
  • 直接用普通方式實現父類的抽象成員。toString()方法無法被繼承
  • 派生類調用基類的方法

                 如果要在派生類裡調用基類的方法需要使用callBaseMethod方法,具體的調用方法如下



      var description = MyNamespace.Intern.callBaseMethod(this, "getDescription", "hello", "world");

      第一個參數為this指針,第二個參數為基類的方法名,後面的參數為激勵方法的參數,是一個不定參數。

      • 接口:接口與注冊類的方式相同,但是構造函數和所有的方法拋出異常,表明是一個抽象方法。注冊時使用registerInterface方法。注意:接口無法繼承其他接口,並且由於JS時弱類型語言,那麼接口只是標記作用,只是在反射方法中反映出效果

        MyNamespace.IEmployee = function()
        ...{
            throw Error.notImplemented();
        }
        MyNamespace.IEmployee.prototype = 
        ...{
            calcaulateSalary : function()
            ...{
                throw Error.notImplemented();
            },
            
            get_type : function()
            ...{
                throw Error.notImplemented();
            }
        }
        MyNamespace.IEmployee.registerInterface("MyNamespace.IEmployee");
      • 如何實現接口:在使用registerClass方法注冊類時可以傳入額外的參數來實現接口

        MyNamespace.MyClass.registerClass("MyNamespace.MyClass", null // 表示沒有父類,
        MyNamespace.IMyInterface1,MyNamespace.IMyInterface2, ...);

                      注意:在ASP.Net AJax中與.Net中一樣,只能單繼承,但可以實現多接口

          4、枚舉類型

          • 枚舉類型就是數字
          • 它的存在是為了增加代碼的可讀性
          • 可以定義為標記
          • 每個枚舉類型都有toString和parse方法

            MyNamespace.MyFlags = function()
            ...{
                throw Error.notImplemented();
            }
            MyNamespace.MyFlags.prototype = 
            ...{
                Item1 : 1,
                Item2 : 2,
                Item3 : 4,
                None : 0,
                All : 7
            }
            MyNamespace.MyFlags.registerEnum("MyNamespace.MyFlags", true);

                     注冊枚舉使用registerEnum方法,第二個參數是判斷是否是標記類型類型,可缺省,如果是一個標記,那麼內部成員的值按照2的次方賦予。枚舉類型是沒有構造函數的,所以構造函數拋出未實現異常。枚舉類型的toString方法有兩種,一種是prototype的toString方法,沒有參數,它是直接將此枚舉對象轉化為數字,然後作為字符串輸出。另一種是枚舉類型中的靜態方法,需要傳遞一個參數,參數類型為枚舉類型,它轉換這個枚舉對象為枚舉的描述。枚舉類型的parse方法如下


          MyNamespace.MyFlags.parse("Item1,Item2");

          如果參數的字符串中只有Item1,那麼表示把Item1字符串轉換為一個標記或一個枚舉類型,但如果有多個參數,那麼是將兩個值‘或’或者‘加起來’

          4、反射方法

          反射的prototype方法 NamespaceName.ClassName.getBaseType() 得到基類的類型 NamespaceName.ClassName.getInterfaces() 得到實現的接口集合 NamespaceName.ClassName.getName() 得到類型名 NamespaceName.ClassName.implementsInterface(NamespaceName.InterfaceName) 得到一個布爾值,判斷是否實現了某個接口,實現了返回true,否則返回false NamespaceName.ClassName.inheritsFrom(Namespace.ClassName) 得到一個布爾值,判斷是否繼承了某個類,繼承了返回true,否則返回false NamespaceName.Interface.isImplementedBy(Namespace.ClassName) 判斷一個接口是否被另外一個類實現了,實現了返回true,否則返回false Namespace.ClassName.isInstanceOfType(instance)

          判斷某個類型的實例是否是這個類型。是返回true,否則返回false

          Type的靜態方法 Type.getRootNamespaces() 得到根命名空間的集合 Type.isClass(Namespace.ClassName) 判斷一個類型是否是類,是返回true,否則返回false Type.isNamespace(Namespace) 判斷一個類型是否是命名空間 Type.isEnum(TypeName) 判斷一個類型是否是枚舉類型 Type.isFlags(TypeName) 判斷一個類型是否是標記 Type.parse(Namespace.ClassName) 通過反射的方法,按照類名,和命名空間創建一個命名空間下的某個類的實例 Object.getType(Instance) 通過實例得到這個實例的類型 Object.getTypeName(Instance)

          通過實例得到這個實例的類型名

          使用Asp.Net Ajax客戶端編程可能需要用到js文那麼在頁面上需要引入這個JS文件。但是不能使用src=地址這種方法引入文件,因為直接使用這種方法導入文件,要包含Asp.Net AJax客戶端組件的js文件。最好在ScriptManager裡面加入一個Scirpts標簽然後在Scripts裡加入<asp:ScriptReference Path="JS"/>,因為使用ScriptManager來引用會自動導入ASP.Net AJax的客戶端組件的JS文件



          <ASP:ScriptManager ID="ScriptManager1" runat="server">
              <Script>...
                  <ASP:ScriptReference Path="Employee.JS"/ >
              </Script>
          </ASP:ScriptManager>並且,所有的類型調用,方法調用都必須在這個ScirptManager之後,否則會造成找不到類型錯誤

      1. 上一頁:
      2. 下一頁:
      Copyright © 程式師世界 All Rights Reserved