C#抽象類


abstract修飾符可以和類、方法、屬性、索引器及事件一起使用,在類聲明中使用abstract修飾符以表明這個類只能是其他類的基類。

抽象類的特性

(1)抽象類不能被實例化

(2)抽象類可以包含抽象方法和抽象訪問器

(3)不能用sealed修飾符修改抽象類,因為抽象類本身就是用來給其他類繼承的

(4)抽象類的非抽象子類必須實現其繼承的所有抽象方法和抽象訪問器

抽象方法

(1)抽象方法是隱式的虛方法

(2)抽象方法只允許聲明在抽象類中

(3)抽象方法不能提供實際的實現,所以沒有方法體;抽象方法的實現是在非抽象的派生類中以override重寫實現的

(4)抽象方法聲明中不可以使用static或者virtual修飾符

(5)abstract關鍵字不能修飾靜態方法或靜態屬性

抽象類的構造函數

(1)不要再抽象類中定義public或protected internal訪問權限的構造函數

(2)應在抽象類中定義protected或private訪問權限的構造函數

(3)如果在抽象類中定義一個protected構造函數,則在實例化派生類時,基類可以執行初始化任務

抽象方法和虛方法的區別

虛方法有實現部分,並且派生類對其重寫是可選的;抽象方法沒有實現部分,並且強制非抽象派生類對其重寫

 

重寫虛方法例子中的代碼,改為抽象的方式實現

using System;
using System.Collections;

//抽象類
public abstract class Animal
{
    protected string face;
    //聲明為protected的構造函數,在實例化派生類時,基類可以執行初始化工作
    protected Animal() { this.face = "^_^"; /*抽象類構造函數初始化的例子*/}
    public abstract void eat();
    public abstract string Face
    {
        get;
    }
}

public class dog : Animal
{
    //重寫基類中的抽象訪問器Face
    public override string Face
    {
        get
        {
            return face;
        }
    }
    //重寫基類中的抽象方法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("貓吃魚 " + 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();
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM