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

C#中的抽象方法,虛方法,介面之間的對比

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開發工具就會提示我們實現抽象類,點一下,去寫自己的程式碼就可以了,然後就是呼叫了

            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)介面,抽象類是否可繼承實體類,但前提是實體類必須有明確的建構函式。