1. 程式人生 > >C#中的抽象方法,虛方法,接口之間的對比

C#中的抽象方法,虛方法,接口之間的對比

rep ace line light brush abs replay size 它的

1.首先來看一看抽象類

抽象類是特殊的類,不能夠被實例化;具有類的其他特性;抽象方法只能聲明於抽象類中,且不包含任何實現 (就是不能有方法體),派生類也就是子類必須對其進行重寫。
另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。
關鍵字就是 abstract
/*
     * 抽象方法必須寫在,抽象類中
     *
     */
    public abstract class Animal
    {

public abstract void Sleep(); public abstract void
Eat(); }

這裏定義了一個抽象類和兩個抽象方法,之後我們在定義子類去繼承它

/*
     *抽象類必須被重寫
     */
    public class cat : Animal
    {
        public override void Eat()
        {
            Console.WriteLine("我是cat,重寫了Eat");
        }

        public override void Sleep()
        {
            Console.WriteLine("我是cat,重寫了Sleep
"); } }

這裏定義了一個cat類去繼承Animal,如果不實現的話,就會報如下的錯誤

技術分享圖片

這裏vs開發工具就會提示我們實現抽象類,vs可以自動幫我們去實現,然後去寫自己的代碼就可以了,然後就是調用

            Animal an = new cat();
            an.Eat();
            an.Sleep();

因為cat類繼承了Animal並重寫了裏面的方法,所以我們可以直接替換Animal讓cat代替出現,抽象類同樣也可以定義自己的方法,例如:

    public abstract class Animal
    {
        
public void show() { Console.WriteLine("我是抽象類自己的方法"); } public abstract void Sleep(); public abstract void Eat(); }

2.我們再來看一看虛方法

virtual關鍵字用於修飾方法

/*
     * 虛方法,必須有方法體
     */
    public class people
    {
        public virtual void Sleep() { }
        public virtual void Eat() { }
    }

定義虛方法必須要有方法體,然後定義子類去繼承people

/*
     * 虛方法可以不被重寫
     */
    public class student:people
    {
        public override void Sleep()
        {
            Console.WriteLine("我是student,");
        }
    }

如果說只是繼承了people這個類而沒有去重寫它的方法,這樣的情況是不會報錯的,我在這裏只是重寫了people的Sleep方法,override後面加返回值類型 基類的方法名

然後就是調用

people op = new student();
op.Sleep();

3.然後就是接口

接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量

/*
     * 接口中的成員是隱式公有的,不能加修飾符
     */
    public interface ImyInterface
    {
        int aa { get; set; }
        void test();
    }

然後我們去定義子類,實現接口

public class overInterface : ImyInterface
    {
        public int aa { get; set; }

        public void test()
        {
            Console.WriteLine("我實現了接口,");
        }
    }

如果不實現接口,就會報以下錯誤

技術分享圖片

然後就是調用

ImyInterface ter = new overInterface();
            ter.aa = 45;
            ter.test();
            Console.WriteLine(ter.aa);

那麽我們來總結一下

抽象方法:

1.必須定義在抽象類中,

2.不能夠被實例化

3.子類必須對其進行重寫

4.定義抽象方法時不能夠有方法體 { } 都不能有

5:關鍵字 abstract

虛方法:

1:可以不被重寫

2:定義方法時能夠有自己的方法體

3:關鍵字:virtual

接口:

1:定義時不能加訪問修飾符,也不能有方法體

2:它的子類必須實現所有方法,與抽象類相似

3:關鍵字:interface

那麽這裏有一個問題:

接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?

答案:

接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。












C#中的抽象方法,虛方法,接口之間的對比