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
         
     }
 }

你可能感兴趣的:(virtual)