1. 程式人生 > >C#:abstarct 和 virtual關鍵字的區別分析,new 與 override關鍵字區別分析

C#:abstarct 和 virtual關鍵字的區別分析,new 與 override關鍵字區別分析

1.首先


absratct 和 virtual 都是與繼承概念有關係。

2.區別


① virtual 關鍵字用於在父類中修飾方法,該方法在父類中可提供實現,並且子類中使用此方法有兩種方式。

方式1:

在父類中定義了virtual方法,在子類中沒有用override修飾該方法(不寫預設是new修飾或明顯的用new修飾),那麼在對(父類宣告的子類例項的物件)的呼叫中,該方法使用的是父類定義的方法。通過強制型別轉換,外面還可以呼叫父類的實現。

程式碼如下:

using System;
namespace StudyLanguage
{
    class Parent
    {
        public virtual void print()
        {
            Console.WriteLine("基類print()方法的列印");
        }


    }

    class Child : Parent
    {
        public new void print()
        {
            Console.WriteLine("子類print()方法的列印");
        }
    }

    class Test
    {
        static void Main(String[] args)
        {
            Console.WriteLine("子類宣告,子類例項的物件:");
            Child child1 = new Child();
            child1.print();
            Console.WriteLine("強制轉換後的列印如下:");
            ((Parent)child1).print();

            Console.WriteLine("\n父類宣告,子類例項的物件:");
            Parent parent1 = new Child();
            parent1.print();


            Console.Write("輸入任意按鍵結束退出...");
            Console.ReadKey();
        }
    }


}

列印如下:

 

方式2:

在父類中定義了virtual方法,在子類中使用override重寫該方法。那麼在對(父類宣告的子類例項的物件)的呼叫中,該方法使用的是子類重寫的方法。通過強制型別轉換後,外面也不可以呼叫父類的實現。

程式碼如下:

using System;
namespace StudyLanguage
{
    class Parent
    {
        public virtual void print()
        {
            Console.WriteLine("基類print()方法的列印");
        }


    }

    class Child : Parent
    {
        public override void print()
        {
            Console.WriteLine("子類print()方法的列印");
        }
    }

    class Test
    {
        static void Main(String[] args)
        {
            Console.WriteLine("子類宣告子類例項的物件:");
            Child child1 = new Child();
            child1.print();
            Console.WriteLine("強制轉換後的列印如下:");
            ((Parent)child1).print();

            Console.WriteLine("\n父類宣告子類例項的物件:");
            Parent parent1 = new Child();
            parent1.print();


            Console.Write("輸入任意按鍵結束退出...");
            Console.ReadKey();
        }
    }


}

列印如下:

 

為什麼 new 和 override 有如此區別?

override是重寫,即將父類的方法在子類裡直接抹去重新寫,故而呼叫的方法就是子類方法。

new只是將父類的方法在子類裡隱藏起來,故而呼叫的仍舊是父類方法。

 

 

② abstract 關鍵字只能用在抽象類中修飾方法,並且沒有具體的實現,子類必須使用override重寫方法。

程式碼如下:

using System;
namespace StudyLanguage
{
    abstract class Parent
    {
        public abstract void print();
    }

    class Child : Parent
    {
        public override void print()
        {
            Console.WriteLine("子類print()方法的列印");
        }
    }

    class Test
    {
        static void Main(String[] args)
        {

            Child child1 = new Child();
            child1.print();
            Console.WriteLine("強制轉換後的列印如下:");
            ((Parent)child1).print();
            
            Parent parent1 = new Child();
            parent1.print();


            Console.Write("輸入任意按鍵結束退出...");
            Console.ReadKey();
        }
    }


}

注意:沒有 Parent p = new Parent(),因為Parent是抽象類。

 

3.介面 interface


1.介面只提供方法規約,不提供方法體;
2.介面中的方法不能用關鍵字(public也不行)修飾;     抽象類中可以有 public修飾方法
3.接口裡不能有介面和變數;   抽象類中可以有介面和變數
4.接口裡的方法在子類中必須全部實現;
5.介面可以實現多重繼承; 類只能單繼承,介面可以多繼承

示例程式碼如下:

using System;
namespace StudyLanguage
{
    public interface MyInterFace
    {
        void getName();
    }


    abstract class Parent
    {
        public int id = 1;
        interface Mi
        {
            int testMi();
        }
        public abstract void print();
    }

    class Child : Parent,MyInterFace
    {
        public override void print()
        {
            Console.WriteLine("重寫抽象類中的方法的列印");
        }

        public void getId()
        {
            //抽象類中的變數
            Console.WriteLine(id);
        }

        public void getName()
        {
            Console.WriteLine("重寫介面中的方法的列印");
        }
        

    }

    class Test
    {
        static void Main(String[] args)
        {

            Child child1 = new Child();
            child1.print();
            child1.getId();
            child1.getName();

            Console.Write("輸入任意按鍵結束退出...");
            Console.ReadKey();
        }
    }


}

列印如下: