C#abstract用法

abstract可以用來修飾類,方法,屬性,索引器和時間,這裏不包括字段. 使用abstrac修飾的類,該類只能作爲其他類的基類,不能實例化,而且abstract修飾的成員在派生類中必須全部實現,不允許部分實現,否則編譯異常. 如:
using System;

namespace ConsoleApplication8
{
class Program
{
static void Main(string[] args)
{
BClass b = new BClass();
b.m1();
}
}
abstract class AClass
{
public abstract void m1();
public abstract void m2();
}
class BClass : AClass
{
public override void m1()
{
throw new NotImplementedException();
}
//public override void m2()
//{
// throw new NotImplementedException();
//}
}
}
Abstract classes have the following features:
抽象類擁有如下特徵:
1,抽象類不能被實例化, 但可以有實例構造函數, 類是否可以實例化取決於是否擁有實例化的權限 (對於抽象類的權限是abstract, 禁止實例化),
即使不提供構造函數, 編譯器也會提供默認構造函數;
2,抽象類可以包含抽象方法和訪問器;
3,抽象類不能使用sealed修飾, sealed意爲不能被繼承;
4,所有繼承自抽象類的非抽象類必須實現所有的抽象成員,包括方法,屬性,索引器,事件;
abstract修飾的方法有如下特徵:
1,抽象方法即是虛擬方法(隱含);
2,抽象方法只能在抽象類中聲明;
3,因爲抽象方法只是聲明, 不提供實現, 所以方法只以分號結束,沒有方法體,即沒有花括號部分;如
public abstract void MyMethod();
4,override修飾的覆蓋方法提供實現,且只能作爲非抽象類的成員;
5,在抽象方法的聲明上不能使用virtual或者是static修飾.即不能是靜態的,又因爲abstract已經是虛擬的,無需再用virtual強調.
抽象屬性儘管在行爲上與抽象方法相似,但仍有有如下不同:
1,不能在靜態屬性上應用abstract修飾符;
2,抽象屬性在非抽象的派生類中覆蓋重寫,使用override修飾符;

抽象類與接口:
1,抽象類必須提供所有接口成員的實現;
2,繼承接口的抽象類可以將接口的成員映射位抽象方法.
如:
interface I
{
void M();
}
abstract class C: I
{
public abstract void M();
}
抽象類實例:
// abstract_keyword.cs
// 抽象類
using System;
abstract class BaseClass // 抽象類
{
protected int _x = 100; //抽象類可以定義字段,但不可以是抽象字段,也沒有這一說法.
protected int _y = 150;
public BaseClass(int i) //可以定義實例構造函數,僅供派生的非抽象類調用; 這裏顯式提供構造函數,編譯器將不再提供默認構造函數.
{
fielda = i;
}
public BaseClass()
{
}
private int fielda;
public static int fieldsa = 0;
public abstract void AbstractMethod(); // 抽象方法
public abstract int X { get; } //抽象屬性
public abstract int Y { get; }
public abstract string IdxString { get; set; } //抽象屬性
public abstract char this[int i] { get; } //抽象索引器
}

class DerivedClass : BaseClass
{
private string idxstring;
private int fieldb;
//如果基類中沒有定義無參構造函數,但存在有參數的構造函數,
//那麼這裏派生類得構造函數必須調用基類的有參數構造函數,否則編譯出錯
public DerivedClass(int p)
: base(p) //這裏的:base(p)可省略,因爲基類定義了默認的無參構造函數
{
fieldb = p;
}
public override string IdxString //覆蓋重新屬性
{
get
{
return idxstring;
}
set
{
idxstring = value;
}
}
public override char this[int i] //覆蓋重寫索引器
{
get { return IdxString[i]; }
}
public override void AbstractMethod()
{
_x++;
_y++;
}

public override int X   // 覆蓋重寫屬性
{
    get
    {
        return _x + 10;
    }
}




public override int Y   // 覆蓋重寫屬性
{
    get
    {
        return _y + 10;
    }
}




static void Main()
{
    DerivedClass o = new DerivedClass(1);
    o.AbstractMethod();
    Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
}

}

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