C#之淺談抽象方法和虛方法

抽象類:
有時我們表達一些抽象的東西,它是一種概括,不需要它成爲一種實體,所以面向對象便有了抽象類。
具體來講:一個員工,它屬於一個公司,但是公司只是一個名稱,我們不需要它成爲一個實體,所以公司就是一個抽象類。
何時必須聲明一個類爲抽象類?(面試題)
當這個類中包含抽象方法時,或是該類並沒有完全實現父類的抽象方法時。
抽象類的特點:
抽象類使用abstract修飾符,並且它只能是用作基類。
抽象類不能實例化,當使用new運算符對其實例時會出現編譯錯誤。
允許(但不要求)抽象類包含抽象成員。(非抽象類不能包括抽象成員)
抽象類不能被密封。

抽象類可以被抽象類所繼承,結果仍是抽象類。

介紹一下這兩種方法:

一、Virtual方法(虛方法)

     virtual 關鍵字用於在基類中修飾方法。virtual的使用會有兩種情況:

     情況1:在基類中定義了virtual方法,但在派生類中沒有重寫該虛方法。那麼在對派生類實例的調用中,該虛方法使用的是基類定義的方法。

     情況2:在基類中定義了virtual方法,然後在派生類中使用override重寫該方法。那麼在對派生類實例的調用中,該虛方法使用的是派生重寫的方法。

二、Abstract方法(抽象方法)

     abstract關鍵字只能用在抽象類中修飾方法,並且沒有具體的實現。抽象方法的實現必須在派生類中使用override關鍵字來實現。請務必將抽象方法放在抽象類中。派生類必須全部實現父類的方法。


這是我自己總結的他們的簡單的區別:



抽象方法的使用:

 父類:public abstract void SayHi();

子類:使用override重寫

public override void SayHi()

        {
            Console.WriteLine("我的名字是: {0} ,年齡是{1},愛好有{2}",Name,Age,Hoddy);

        }


在program裏:

 List<Person> lists = new List<Person>();
            for (int i = 1; i <=5; i++)
            {
                Student stu = new Student("cmz" + i.ToString(), 20 + i, "愛好無");
                lists.Add(stu);
                Teacher tea = new Teacher("程沐喆" + i.ToString(), 30 + i, 5 + i);
                lists.Add(tea);
            }


            for (int i = 0; i < lists.Count; i++)
            {
              

                (lists[i] as Person).SayHi();
            }


            Console.Read();


虛方法的使用:

1.在父類裏寫SayHi方法

private Genders gender;
        public Genders Gender
        {
            get { return gender; }
            set { gender = value; }
        }


        public virtual void SayHi()
        {
            string message;
            string sex;
            switch (this.gender)
            {
                case Genders.Female:
                    sex = "女士";
                    break;
                case Genders.Male:
                    sex = "先生";
                    break;
                default:
                    sex = "外星人";
                    break;
            }
            message = string.Format(
                "大家好,我是 {0} {1}。我今年 {2} 歲了。!",
                this.Name, sex, this.Age
            );
            MessageBox.Show(message);

        }

2.在student裏使用override重寫:

 override public void SayHi()
        {
            string message = string.Format(
                "大家好,我是 {0} 同學,今年 {1} 歲了,我喜歡 {2}!",
                base.Name, base.Age, this.hobby
            );
            MessageBox.Show(message);

        }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章