abstract修飾符可以和類(lèi)、方法、屬性、索引器及事件一起使用,在類(lèi)聲明中使用abstract修飾符以表明這個(gè)類(lèi)只能是其他類(lèi)的基類(lèi)。
抽象類(lèi)的特性
(1)抽象類(lèi)不能被實(shí)例化
(2)抽象類(lèi)可以包含抽象方法和抽象訪(fǎng)問(wèn)器
(3)不能用sealed修飾符修改抽象類(lèi),因為抽象類(lèi)本身就是用來(lái)給其他類(lèi)繼承的
(4)抽象類(lèi)的非抽象子類(lèi)必須實(shí)現其繼承的所有抽象方法和抽象訪(fǎng)問(wèn)器
抽象方法
(1)抽象方法是隱式的虛方法
(2)抽象方法只允許聲明在抽象類(lèi)中
(3)抽象方法不能提供實(shí)際的實(shí)現,所以沒(méi)有方法體;抽象方法的實(shí)現是在非抽象的派生類(lèi)中以override重寫(xiě)實(shí)現的
(4)抽象方法聲明中不可以使用static或者virtual修飾符
(5)abstract關(guān)鍵字不能修飾靜態(tài)方法或靜態(tài)屬性
抽象類(lèi)的構造函數
(1)不要再抽象類(lèi)中定義public或protected internal訪(fǎng)問(wèn)權限的構造函數
(2)應在抽象類(lèi)中定義protected或private訪(fǎng)問(wèn)權限的構造函數
(3)如果在抽象類(lèi)中定義一個(gè)protected構造函數,則在實(shí)例化派生類(lèi)時(shí),基類(lèi)可以執行初始化任務(wù)
抽象方法和虛方法的區別
虛方法有實(shí)現部分,并且派生類(lèi)對其重寫(xiě)是可選的;抽象方法沒(méi)有實(shí)現部分,并且強制非抽象派生類(lèi)對其重寫(xiě)
重寫(xiě)虛方法例子中的代碼,改為抽象的方式實(shí)現
using System;using System.Collections;//抽象類(lèi)public abstract class Animal{ protected string face; //聲明為protected的構造函數,在實(shí)例化派生類(lèi)時(shí),基類(lèi)可以執行初始化工作 protected Animal() { this.face = "^_^"; /*抽象類(lèi)構造函數初始化的例子*/} public abstract void eat(); public abstract string Face { get; }}public class dog : Animal{ //重寫(xiě)基類(lèi)中的抽象訪(fǎng)問(wèn)器Face public override string Face { get { return face; } } //重寫(xiě)基類(lèi)中的抽象方法eat public override void eat() { Console.WriteLine("狗吃骨頭 " + Face); }}public class cat : Animal{ public override string Face { get { return face; } } public override void eat() { Console.WriteLine("貓吃魚(yú) " + Face); }}public class panda : Animal{ public override string Face { get { return face; } } public override void eat() { Console.WriteLine("熊貓吃竹子 " + Face); }}public class MainFun{ static void Main() { Animal[] anim = new Animal[3]; anim[0] = new dog(); anim[1] = new cat(); anim[2] = new panda(); anim[0].eat(); anim[1].eat(); anim[2].eat(); Console.ReadKey(); }}
聯(lián)系客服