C#語法學習虛方法(virtual)

/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/3
 * Time: 上午 10:20
 * 虛方法(virtual)
 * virtual關鍵字用於修飾方法,屬性,索引器或是事件聲明
 * 並且允許在派生類中重寫這些對像.
 * 
 * 
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/

using System;
class A
{
    
public void F()
    {
        Console.WriteLine(
"A.F");
    }
}
class B:A
{
    
public new void F()
    {
        Console.WriteLine(
"B.F");
    }
}
class Test
{
    
static void Main()
    {
        B b
=new B();//由於b繼承自A,所以在b內有兩個方法F
        A a=b;//這里進行了一次隱式轉換,轉換成了A對像.
        a.F();//a的指針是指向b對像中所包含的A.F()方法.
        b.F();
    }
}
/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/3
 * Time: 上午 10:20
 * 虛方法(virtual)
 * virtual關鍵字用於修飾方法,屬性,索引器或是事件聲明
 * 並且允許在派生類中重寫這些對像.
 * 
 * 
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/

using System;
class A
{
    
//virtual && override是成對出現的
    
//virtual定議一個虛方法
    
//override覆蓋一個虛方法
    
//這里就形成了面向對像的一個很重要的特性:多態
    
//多態是指兩個或是多個屬於不同類的對像
    
//對同一個消息做出不同的響應的能力
    public virtual void F()
    {
        Console.WriteLine(
"A.F");
    }
}
class B:A
{
    
public override void F()
    {
        Console.WriteLine(
"B.F");
    }
}
class Test
{
    
static void Main()
    {
        B b
=new B();//由於b繼承自A,所以在b內有兩個方法F
        A a=b;//這里進行了一次隱式轉換,轉換成了A對像.
        a.F();//此處因為使用了virtual,所以輸出結果也是為B.F;
        b.F();
    }
}
/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/3
 * Time: 上午 10:20
 * 虛方法(virtual)
 * virtual關鍵字用於修飾方法,屬性,索引器或是事件聲明
 * 並且允許在派生類中重寫這些對像.
 * 
 * 
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/

using System;
class A
{
    
//virtual && override是成對出現的
    
//virtual定議一個虛方法
    
//override覆蓋一個虛方法
    
//這里就形成了面向對像的一個很重要的特性:多態
    
//多態是指兩個或是多個屬於不同類的對像
    
//對同一個消息做出不同的響應的能力
    public virtual void F()
    {
        Console.WriteLine(
"A.F");
    }
}
class B:A
{
    
public override void F()
    {
        Console.WriteLine(
"B.F");
    }
}
class C:B
{
    
public override void F()
    {
        Console.WriteLine(
"C.F");
    }
}
class Test
{
    
static void Main()
    {
        C c
=new C();
        A a
=c;
        B b
=c;
        a.F();
        b.F();
        c.F();
//類C此時覆蓋了A,B的f方法
    }
}
/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/3
 * Time: 上午 10:41
 * 通常情況下子類中都會調用父類的方法.
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/

using System;
class Employee
{
    
protected string _name;
    
public Employee(){}
    
public Employee(string name)
    {
        
this._name=name;
    }
    
public virtual void StartWork()
    {
        Console.Write(
this._name + "開始工作:");
    }
}
class Manager : Employee
{
    
public Manager(string name):base(name){}
    
public override void StartWork()
    {
        
base.StartWork();//在子類中調用父類的方法
        Console.WriteLine("給員工下達任務");
    }
}
class Secretary : Employee
{
    
public Secretary(string name):base(name){}
    
public override void StartWork()
    {
        
base.StartWork();//在子類中調用父類的方法
        Console.WriteLine("協助經理");
    }
}

class Seller : Employee
{
    
public Seller(string name):base(name){}
    
public override void StartWork()
    {
        
base.StartWork();//在子類中調用父類的方法
        Console.WriteLine("銷售產品");
    }
}
//新增員工時只需要再新增一個類繼承自Employee
class Accountant : Employee
{
    
public Accountant(string name):base(name){}
    
public override void StartWork()
    {
        
base.StartWork();//在子類中調用父類的方法
        Console.WriteLine("管理公司財政");
    }
}
class Test
{
    
static void Main()
    {
        Employee[] emp
=new Employee[5];
        emp[
0]=new Manager("經理張三");
        emp[
1]=new Secretary("助理李四");
        emp[
2]=new Seller("王五");
        emp[
3]=new Seller("馬六");
        emp[
4]=new Accountant("錢七");
        Console.WriteLine(
"早上八點,開始工作.");
        
foreach(Employee e in emp)
        {
            e.StartWork();
        }
    }
}

/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/4
 * Time: 下午 04:35
 * 這里說明了用
 * virtual && override 
 * virtual && new
 * 這兩種組合的不成結果.
 * 
 * 如果一個類的成員方法是虛方法,其子類可以使用override來覆蓋基類的虛方法
 * 也可以用new來重建一個新的方法.這二者的不同是,用override會把基類的方法
 * 完全覆蓋也就是最後不會有基類的方法存在了.而用new則不會把基類的方法覆蓋
 * ,此時還是可以調用到基類的方法.
 * 
 
*/
 
using System;
 
public class A
 {
     
public virtual void SetStr()
     {
         Console.WriteLine(
"AAA");
     }
 }
 
public class B:A
 {
     
public override void SetStr()
     {
         Console.WriteLine(
"BBB");
     }
 }
 
public class C:A
 {
     
public new void SetStr()
     {
         Console.WriteLine(
"CCC");
     }
 }
 
class Test
 {
     
static void Main()
     {
         
//A a=new A();
         
//a.SetStr();
         
//AAA
         
         
//A a=new B();
         
//a.SetStr();
         
//BBB
         
         A a
=new C();
         a.SetStr();
         
//AAA,這里實際上執行的是基類A的方法
         
         
//B b=new B();
         
//b.SetStr();
         
//BBB
         
         
//C c=new C();
         
//c.SetStr();
         
//CCC
         
     }
 }

posted @ 2008-09-03 11:02  Athrun  阅读(458)  评论(0编辑  收藏  举报