C#抽象類別及其方法的學習

來源:互聯網
上載者:User

標籤:style   blog   http   io   ar   os   使用   sp   on   

在C#中使用關鍵字 abstract 來定義抽象類別和抽象方法。

不能初始化的類被叫做抽象類別,它們只提供部分實現,但是另一個類可以繼承它並且能建立它們
的執行個體。

"一個包含一個或多個純虛函數的類叫抽象類別,抽象類別不能被執行個體化,進一步
一個抽象類別只能通過介面和作為其它類的基類使用."- C++ Programming Language by Stroustrup Chapter13.2

抽象類別能夠被用於類,方法,屬性,索引器和事件,使用abstract 在一個類聲明中表示該類傾向要作為其它類的基類
成員被標示成abstract,或被包含進一個抽象類別,必須被其衍生類別實現。

abstract class ShapesClass
    {
        abstract public int Area();
    }
    class Square : ShapesClass
    {
        int x, y;
        // Not providing an Area method results
        // in a compile-time error.
        public override int Area()
        {
            return x * y;
        }
    }


例如,一個包含非抽象方法的抽象類別:


    abstract class MyAbs
    {
        public void NonAbMethod()
        {
            Console.WriteLine("Non-Abstract Method");
        }
    }
    class MyClass : MyAbs
    {
    }
    class MyClient
    {
        public static void Main()
        {
            //MyAbs mb = new MyAbs();//not possible to create an instance
            MyClass mc = new MyClass();
            mc.NonAbMethod(); // Displays ‘Non-Abstract Method‘
        }
    }



一個抽象類別可以包含抽象和非抽象方法,當一個類繼承於抽象類別,那麼這個衍生類別必須實現所有的
的基類抽象方法。

一個抽象方法是一個沒有方法體的方法。

 abstract class MyAbs
    {
        public void NonAbMethod()
        {
            Console.WriteLine("Non-Abstract Method");
        }
        public abstract void AbMethod(); // An abstract method
    }
    class MyClass : MyAbs//must implement base class abstract methods
    {
        public override void AbMethod()
        {
            Console.WriteLine("Abstarct method");
        }
    }
    class MyClient
    {
        public static void Main()
        {
            MyClass mc = new MyClass();
            mc.NonAbMethod();
            mc.AbMethod();
        }
    }



但是通過聲明衍生類別也為抽象,我們可以避免所有或特定的虛方法的實現,
這就是抽象類別的部分實現。

abstract class MyAbs
    {
        public abstract void AbMethod1();
        public abstract void AbMethod2();
    }
    //not necessary to implement all abstract methods
    //partial implementation is possible
    abstract class MyClass1 : MyAbs
    {
        public override void AbMethod1()
        {
            Console.WriteLine("Abstarct method #1");
        }
    }
    class MyClass : MyClass1
    {
        public override void AbMethod2()
        {
            Console.WriteLine("Abstarct method #2");
        }
    }
    class MyClient
    {
        public static void Main()
        {
            MyClass mc = new MyClass();
            mc.AbMethod1();
            mc.AbMethod2();
        }
    }


在C#中,一個抽象類別能夠繼承另一個非抽象類別,另外,繼承了基類的方法,添加新的
抽象和非抽象方法是可行的。

 class MyClass1 // Non-Abstract class
    {
        public void Method1()
        {
            Console.WriteLine("Method of a non-abstract class");
        }
    }
    abstract class MyAbs : MyClass1 // Inherits from an non-abstract class
    {
        public abstract void AbMethod1();
    }
    class MyClass : MyAbs//must implement base class abstract methods
    {
        public override void AbMethod1()
        {
            Console.WriteLine("Abstarct method #1 of MyClass");
        }
    }
    class MyClient
    {
        public static void Main()
        {
            MyClass mc = new MyClass();
            mc.Method1();
            mc.AbMethod1();
        }
    }


一個抽象類別也能從一個介面來實現,這種情況,我們必須為所有的方法提供方法體,這些方法是來自介面

    interface IInterface
    {
        void Method1();
    }
    abstract class MyAbs : IInterface
    {
        public void Method1()
        {
            Console.WriteLine("Method implemented from the IInterface");
        }
    }
    class MyClass : MyAbs//must implement base class abstract method
    {
    }
    class MyClient
    {
        public static void Main()
        {
        MyClass mc = new MyClass();
        mc.Method1();
        }
    } 

 我們不能把關鍵字abstract 和 sealed 一起用在C#中,因為一個密封類不能夠被抽象。

 abstract class MyAbs
    {
        public abstract void AbMethod1();
        public abstract void AbMethod2();
    }
    class MyClass1 : MyAbs
    {
        public override void AbMethod1()
        {
            Console.WriteLine("Abstarct method #1 of MyClass1");
        }
        public override void AbMethod2()
        {
            Console.WriteLine("Abstarct method #2 of MyClass1");
        }
    }
    class MyClient
    {
        public static void Main()
        {
            MyAbs ma1 = new MyClass1();// Polymorphism
            ma1.AbMethod1();
            ma1.AbMethod2();
        }
    }

 

抽象方法有以下特徵:

1.一個抽象方法可以看作是一個虛函數。

2.抽象方法的聲明只能在抽象類別中。

3.因為抽象方法聲明只提供一個無實現的方式,沒有方法體

4.方法體的實現被覆寫方法提供,覆寫方法是一個非抽象類別的成員。

5.抽象屬性的行為和抽象方法相像,除了不同的聲明形式。

6.在一個靜態屬性中使用abstract 是一個錯誤。

        *一個抽象屬效能夠通過衍生類別使用 override 實現.

對於抽象類別:

一個抽象類別必須為所有的介面成員提供實現
一個用於實現介面的抽象類別可能把介面方法安排到抽象方法上。例如

interface I 
{
    void M();
}
abstract class C: I 
{
    public abstract void M();
}


抽象類別具有以下特徵:

1.抽象類別不能被執行個體化。

2.抽象類別可以包含抽象方法和訪問器

3.不能把抽象類別用密封(sealed)來修飾,那就意味著類不能被繼承,這違反抽象類別被繼承的原則。

4.一個派生於一個抽象類別的非抽象類別必須包括所有的繼承來的抽象方法和訪問器的實現

5.在方法和屬性中使用abstract 關鍵字意味著包含它們的實現。

C#抽象類別及其方法的學習

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.