自强不息,止于至善

身无半文,心忧天下;手释万卷,神交古人
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

客户端面向对象类型系统

Posted on 2007-10-27 16:16  L.Zhang  阅读(170)  评论(0)    收藏  举报

//脚本文件Employee.js

//注册名称空间
Type.registerNamespace("MyNamespace");


//定义枚举
MyNamespace.EmployeeType = function()
{
    
throw Error.notImploemented();
}
//定义枚举项
MyNamespace.EmployeeType.prototype = 
{
    Intern : 
0,
    Vendor : 
1,
    FulltimeEmployee : 
2
}
//注册枚举
MyNamespace.EmployeeType.registerEnum("MyNamespace.EmployeeType");


//定义IEmployee接口,所有的方法直接抛出异常
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");



//1,定义Employee类(因为有抽象方法,所以为抽象类)的构造方法
MyNamespace.Employee = function(name)
{
    
this._name = name ? name : "[Anonymous]";
    
this._year = 0;
}
//2,用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());
    }
}
//3,注册Employee实现了IEmployee接口
MyNamespace.Employee.registerClass("MyNamespace.Employee"null,
    MyNamespace.IEmployee);
    
    
    
    
//1,定义Intern类的构造方法,它为Employee类的子类。
MyNamespace.Intern = function(name)
{
    
//调用父类的构造函数
    MyNamespace.Intern.initializeBase(this, [name]);
}
//2,用prototype方式定义属性与方法
MyNamespace.Intern.prototype = 
{
    
//同名方法,覆盖父类的方法
    calculateSalary : function()
    {
        
return 2000;
    },
    
//同名方法,覆盖父类的方法
    getDescription : function()
    {
        
//调用父类的方法有三个参数(1,自己的实例,2,父类方法名,3,参数表)
        var description = MyNamespace.Intern.callBaseMethod(this"getDescription");
        
return description + " What a poor intern!";
    },
    
//属性
    get_type : function()
    {
        
return MyNamespace.EmployeeType.Intern;
    }
}
//3,注册Intern类,提供父类
MyNamespace.Intern.registerClass("MyNamespace.Intern", MyNamespace.Employee);


//用同样的方法定义Vendor类
MyNamespace.Vendor = function(name)
{
    MyNamespace.Vendor.initializeBase(
this, [name]);
}
MyNamespace.Vendor.prototype 
= 
{
    calculateSalary : 
function()
    {
        
return 5000 + 1000 * (this.get_year() - 1);
    },
    
    get_type : 
function()
    {
        
return MyNamespace.EmployeeType.Vendor;
    }
}
MyNamespace.Vendor.registerClass(
"MyNamespace.Vendor", MyNamespace.Employee);


//用同样的方法定义FulltimeEmployee类
MyNamespace.FulltimeEmployee = function(name)
{
    MyNamespace.FulltimeEmployee.initializeBase(
this, [name]);
}
MyNamespace.FulltimeEmployee.prototype 
= 
{
    calculateSalary : 
function()
    {
        
return 15000 + 2000 * (this.get_year() - 1);
    },
    
    get_type : 
function()
    {
        
return MyNamespace.EmployeeType.FulltimeEmployee;
    }
}
MyNamespace.FulltimeEmployee.registerClass(
"MyNamespace.FulltimeEmployee", MyNamespace.Employee);


//定义枚举
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);
//使用方法Employee.aspx
 <form id="form1" runat="server">
        
<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Debug">
            
<Scripts>
                
<asp:ScriptReference Path="Employee.js" />
            
</Scripts>
        
</asp:ScriptManager>

        
<div id="info"></div>
        
<script language="javascript" type="text/javascript">
            
function display(text)
            {
                document.getElementById(
"info").innerHTML += (text + "<br />");
            }
            
            
var jeffz = new MyNamespace.Intern("Jeffrey Zhao");
            jeffz.set_year(
3);
            display(jeffz.getDescription());
            
            
var tom = new MyNamespace.Vendor("Tom");
            tom.set_year(
3);
            display(tom.getDescription());
            
            
var jerry = new MyNamespace.FulltimeEmployee("Jerry");
            jerry.set_year(
5);
            display(jerry.getDescription());
            
            
//反射方法
            display("jeffz implements 'IEmployee' interface: " + 
                MyNamespace.IEmployee.isImplementedBy(jeffz));
                
            
var type = MyNamespace.EmployeeType.toString(tom.get_type());
            display(String.format(
"{0} is a {1}.", tom.get_name(), type));
            
            
var all = MyNamespace.MyFlags.All;
            display(MyNamespace.MyFlags.toString(all));
            
            display(MyNamespace.MyFlags.parse(
"Item1, Item3"));
        
</script>
    
</form>