保持快乐,善于表达,敢于创新

运用虚拟/抽象/接口实现多态的例子(-)--虚拟类.

上一篇 / 下一篇  2008-05-30 10:11:15 / 个人分类:c#

using System;
class Employee                                       //基类
{  
 protected string _name;
 public Employee(){}                    //构造函数   
public Employee(string name)     //构造函数  
 {  
     _name=name;  
  }   
public virtual void StartWork()     //虚方法: 虚方法可以声明方法实体 
  {   
    Console.WriteLine(_name+"start work");      
 }
}
class Manager:Employee

  public Manager(string name){}     //name只是在本类的成员变量.  
 public override void StartWork()  
 {  
     base.StartWork();     // 执行基类的方法.   
    Console.WriteLine("assign work to employee");   
  }
}
class Sellor:Employee
{
   public Sellor(string name){}  
 public override void StartWork() 
  {
       base.StartWork();    
   Console.WriteLine("sell products");   
    }
}
class Test
{  
 public static void Main()  
 { 
  Employee[] temp=new Employee[2];    //建立新的employ类并赋给employ类的实例temp.  
 temp[0]=new Manager("zhanag san");   //建立新类manager并赋给employ类的实例temp1. 
  temp[1]=new Sellor("wang liu"); 
  Console.WriteLine("start"); 
  foreach (Employee aa in temp)   
{    
   aa.StartWork();    //实例temp的类是employ, 他们执行方法StartWork, 但此方法是虚的, 已经被子类对应的方法override, 所以执行的是override方法.     此时的实例aa虽然是employ类,但startwork已经被子类重写. 所以父类的virtual方法已经不存在在aa的实例中了.
   } 
  }
}

结果:
start
start work
assign work to employee
start work
sell products

范例二:
如果将virtual去掉, 这个时候,aa实例的startwork方法就是类employ的方法. 而不是子类方法, 无法实现多态.
using System;

class Employee
{
    protected string _name;
    public Employee(){}
    public Employee(string name)
    {
        _name=name;
   
    }
    public void StartWork()
    {
        Console.WriteLine(_name+"start work");
   
    }



}
class Manager:Employee
{
    public Manager(string name){}
    public void StartWork()
    {
        base.StartWork();
        Console.WriteLine("assign work to employee");
   
    }


}
class Sellor:Employee
{
    public Sellor(string name){}
    public  void StartWork()
    {
        base.StartWork();
        Console.WriteLine("sell products");
   
    }


}
class Test
{
    public static void Main()
    {
    Employee[] temp=new Employee[2];
    temp[0]=new Manager("zhanag san");
    temp[1]=new Sellor("wang liu");
    Console.WriteLine("start");
    foreach (Employee aa in temp)
    {
        aa.StartWork();  //因为aa是employ类的实例, 而且方法startwork没有被重写, 所以就是employ的方法.
   
    }
    }
}

执行结果:
start
start work;
start work;


范例三:
base关键字是指的是将子类的方法或者构造函数的成员变量付给父类的方法或者构造函数的成员变量.如上例子:

using System;

class Employee
{
    protected string _name;
    public Employee(){}
    public Employee(string name)       //父类构造函数
    {
        _name=name;
   
    }
    public virtual void StartWork()    //父类成员方法.
    {
        Console.WriteLine(_name+"  start work  ");
   
    }



}
class Manager:Employee
{
    public Manager(string name):base(name){}  //base表示将子类的name的值映射到父类对应的成员变量.
    public override void StartWork()
    {
        base.StartWork();    //base指的父类方法startwork, 尽管父类方法是虚拟的, 但是还可以直接使用的,参见范例三
        Console.WriteLine("assign work to employee");
   
    }


}
class Sellor:Employee
{
    public Sellor(string name):base(name){}
    public override void StartWork()
    {
        base.StartWork();
        Console.WriteLine("sell products");
   
    }


}
class Test
{
    public static void Main()
    {
    Employee[] temp=new Employee[2];
    temp[0]=new Manager("zhanag san");
    temp[1]=new Sellor("wang liu");
    Console.WriteLine("start");
    foreach (Employee aa in temp)
    {
        aa.StartWork();
   
    }
    }
}

结果:

start
zhanag san  start work
assign work to employee
wang liu  start work
sell products

范例三:
using System;

class Employee
{
    protected string _name;
    public Employee(){}
    public Employee(string name)
    {
        _name=name;
   
    }
    public virtual void StartWork()
    {
        Console.WriteLine(_name+"  start work  ");
   
    }



}
class Manager:Employee
{
    public Manager(string name):base(name){}
    public override void StartWork()
    {
        base.StartWork();
        Console.WriteLine("assign work to employee");
   
    }


}
class Sellor:Employee
{
    public Sellor(string name):base(name){}
    public override void StartWork()
    {
        base.StartWork();
        Console.WriteLine("sell products");
   
    }


}
class Test
{
    public static void Main()
    {
        Employee emp=new Employee();
    Manager mana=new Manager("zhanag san");
    Sellor sell=new Sellor("wang liu");
    Console.WriteLine("start");
    emp.StartWork();   //写出类employ的实例emp的方法 startwork. 尽管他是virtual的, 但还是可以写出.
    mana.StartWork(); //写出类manager的实例mana的方法startwork.
    sell.StartWork();
    }
}

结果:
start
  start work    ------emp.StartWork  结果.
zhanag san  start work   ----mana 运行结果.
assign work to employee
wang liu  start work
sell products

TAG:

 

评分:0

我来说两句

Open Toolbar