溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#抽象類和抽象方法

發布時間:2020-07-21 07:53:17 來源:網絡 閱讀:865 作者:海灬未眠 欄目:開發技術

如果一個類不與具體的事物相聯系,而只是表達一種抽象的概念,僅僅是作為其派生類的一個基類,這樣的類就是抽象類,在抽象類中聲明方法時,如果加上abstract時就是抽象方法


  1. 抽象類概述及聲明


抽象類與非抽象類的主要區別:


①.抽象類不能直接被實例化;


②.抽象類中可以只有抽象方法,也可以只有非抽象方法,也可以抽象方法、非抽象方法都有。(非抽象     類中不能有抽象方法);


③.抽象類不能被密封。


以上會在下面例子中一一驗證:  

class Program
    {
        static void Main(string[] args)
        {
            M m = new M();//錯誤提示:無法創建抽象類或接口M的實例。驗證了①,抽象類和接口不能被實例化

        }
    }

    public abstract class M
    {
        public void A()
        {
            Console.WriteLine("調用了A方法");
        }

        public abstract void B() //錯誤提示:M.B()無法聲明主體,因為它標記為abstract。也就是說,抽象方

法不能有方法體。
        {
            Console.WriteLine("調用了B方法");
        }

        public abstract void G();
    }

    public class C
    {
        public abstract void H();//錯誤提示:C.D()是抽象的,但它包含在非抽象類C中。再對比 M 類中的方法A()、B()來看,就驗證了②:非抽象類中不能有抽象方法;抽象類中可以只有抽象方法,也可以只有非抽象方法,也可以抽象方法、非抽象方法都有。

        public void D()
        {

        }
     
    }

    public sealed abstract class E //錯誤提示:E 是抽象類,它不能是密封(sealed)或靜態(static)的。這就驗證了③。
    {

    }

    public static abstract class F //錯誤提示:F 是抽象類,它不能是密封(sealed)或靜態(static)的。這就驗證了③。
    {

}


2.抽象方法概述及聲明


聲明抽象方法時需注意:


①.抽象方法必須聲明在抽象類中(上面已經驗證); 

②.聲明抽象方法時,不能使用virtual、static、private、sealed修飾符;

③.在抽象類中抽象方法不提供實現。


下面例子中會一一驗證: 

class Program
    {
        static void Main(string[] args)
        {
        }
    }

    public abstract class M
    {
        public abstract void A();

        public virtual abstract void B();//錯誤提示:抽象方法 B 不能標記為 virtual。因為虛方法和抽象方法屬于同一個等級的,并列關系。

        public static abstract void C();//錯誤提示:靜態成員 C不能標記為overrid、virtual或abstract。

        private abstract void D();  //錯誤提示:虛擬成員或抽象成員不能是私有的。因為虛擬成員是讓繼承類來override的,如果是private,繼承類都不能看見;抽象方法要是私有的話,這個抽象方法所在的抽象類的子類就沒法實現這個抽象方法,看不見。

        A();//抽象方法在自己的抽象類中不能有方法體,所以不能在本類中實現。要在繼承類中實現。

    }


3.抽象類與抽象方法的使用


直接舉例子:

using System;
using System.Collections.Generic;
using System.Text;
namespace _
{
    public abstract class myClass
    {
        private string id = "";
        private string name = "";
        /// <summary>
        /// 編號屬性及實現
        /// </summary>
        public string ID
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }
        /// <summary>
        /// 姓名屬性及實現
        /// </summary>
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        /// <summary>
        /// 抽象方法,用來輸出信息
        /// </summary>
        public abstract void ShowInfo();
    }

    public class DriveClass:myClass                     //繼承抽象類
    {
        /// <summary>
        /// 重寫抽象類中輸出信息的方法
        /// </summary>
        public override void ShowInfo()
        {
            Console.WriteLine(ID + " " + Name);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //實例化派生類
            DriveClass driveclass = new DriveClass();  
           
            //使用派生類對象實例化抽象類
            myClass myclass = driveclass;    
           
            //使用抽象類對象訪問抽象類中的編號屬性           
            myclass.ID = "BH0001";
          
            //使用抽象類對象訪問抽象類中的姓名屬性                 
            myclass.Name = "TM";                        
           
            //使用抽象類對象調用抽象類中的的抽象方法
            myclass.ShowInfo();                         
        }
    }
}


上例中通過派生類的對象driveclass來實例化抽象類,然后使用抽象類訪問抽象類中的屬性及方法。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女