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

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    26.列表的循环遍历
    效率比较--链表
    心之距离 再回首 光年之遥远
    效率比较--集合
    效率比较--数组
    哈希表
    栈 VS 队列
    struts1 标签引入
    web 连接池配置
    zip&ftp命令
  • 原文地址:https://www.cnblogs.com/Athrun/p/1282726.html
Copyright © 2020-2023  润新知