標籤:

C# 抽象類

1.解釋什麼是抽象類?抽象類是包含抽象方法的類。那麼什麼又是抽象方法呢?抽象方法是沒有方法內容的,只有一個方法名和參數列表的方法。並以;結尾。為了標註他的與眾不同,在他的返回類型前加abstract。並在class前加abstract。簡言之,由abstract修飾的方法和類就是抽象的方法和類。

2. 抽象類的特點① 抽象類只能做父類② 抽象類不能實例化,既不能用new來產生屬於抽象類的對象③ 抽象類中除了抽象方法與普通方法不一樣以外,其他的部分和普通類一樣。即抽象類是普通類的特例,他特殊只是有抽象方法。所以它裡面可以有欄位,屬性,普通方法。

3.抽象方法的特點① 抽象方法是沒有方法內容的,只有一個方法名和參數列表的方法。並以;結尾。② 在方法的返回類型前加abstract

③ 抽象方法的內容由他的繼承類根據繼承類自身情況去寫。重寫這個方法時把abstract替換成override注意:②③也是抽象屬性的定義和實現的方法

例如:abstract class Class1 //定義抽象類 {

protected string name;

protected abstract string Name { //定義抽象屬性 get; }

protected int age;

protected Class1()

{

name = "a";

age = 4;

}

protected abstract void A(); //定義抽象方法 } class Class2:Class1 {

protected override string Nam

{

//實現抽象屬性get { return name; }

}

//實現方法時他的修飾符只能是範圍比父類大,或是相同protected override void A()

{

//實現抽象方法 Console.WriteLine("aaaaaaaaaaaa"); }

static void Main()

{

Class2 c = new Class2(); //正確,繼承類可以定義自己的對象 Class1 c1=new Class1(); //錯誤,抽象類不能定義自己的對象 Console.WriteLine(c.Name + "/n" + c.age);

c.A();

}

}

4.抽象類里的普通方法如果也想在子類中重寫,有兩種方法:①在父類普通方法的返回類型前寫virtual,這就告訴系統父類這個方法是虛的方法,在子類中重寫該方法時,在方法的返回類型前可以什麼也不寫,可以寫new,也可以寫override,然後子類對象調用的方法就是在子類中重寫的方法。

②在父類普通方法的返回類型前什麼都不寫,在子類中重寫該方法時,在方法的返回類型前可以什麼也不寫,可以寫new 。然後子類對象調用的方法就是在子類中重寫的方法。

例如:Abstract Class C

{

Protected abstract void A();

Protected void B(){

Console.WriteLine("bbbbb");

}

}

Class Class1:C

{

Protected void A() {

Console.WriteLine("aaaaaaa"); }

//Protected new void B(){ //正確}

//Protected override void B(){//正確}

Protected void B(){ //正確

Console.WriteLine("cccccccccccccc");

}

Static void Main() {

Class1 c1=new Class();

c.A(); 結果是:aaaaaaa

cccccccccccccc

c.B();

}

}

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/wochuailimin/archive/2010/05/27/5629044.aspx

抽象類和介面

抽象類

類中定義一些不含方法體的方法,它的方法體實現交給該類的子類根據自己的情況去實現,這樣的方法就是抽象方法,包含抽象方法的類就是抽象類。包含的抽象方法一個或多個。。

定義規則:

A. 抽象類abstract修飾符來修飾,抽象方法用abstract來修飾

B. 抽象類不能實例化(就是不能用new 去生成對象)

C. 抽象方法只需聲明,不需實現,

D. 抽象方法的類必須聲明是抽象類,抽象類的子類必須覆蓋所有抽象方法後,才能被實例化,否則還是個抽象類

abstract int aa(int a){} // 錯,有花括弧,有實現部分,只不過為空、、、

正確的形式是:abstract int aa(int a);

抽象類中抽象的方法,必須有關鍵字abstract

Vehicle v = new Car(); 正確

// 多態的體現,雖然抽象類不可以創建對象,但是可以聲明一個變數,引用可以實現了抽象方法的的子類對象,

子類可以繼承抽象類的屬性和方法(和普通類繼承一樣),父類抽象類定義非private的成員變數,子類可以繼承

介面(interface)

如果一個抽象類的所有方法都是抽象的,就可以將這個類用另外一種方式定義,用介面定義。

介面是抽象方法和常量值的集合,從本質上講,介面是一種特殊的抽象類,其中沒有變數和方法實現。

定義:

public interface Runner{

int ID=1;

void run( );//// 不用abstract修飾!!這點和抽象類不同。。要abstract也可以。

}

介面的特點 :

u 在介面里只能聲明抽象方法。

u 介面只能聲明常量(final)

u 介面里只能聲明public的訪問許可權

int ID = 1; 相當於public static final int ID = 1;

介面定義中成員默認都是public訪問類型的,

變數默認都是public static final標識的,所以介面中定義的變數都是全局靜態常量

用法:

u 定義一個新介面,用extends繼承一個已有介面

u 定義一個類,用implements去實現一個介面中所有方法

u 定義一個抽象類,用implements去實現已有介面中的部分方法

u 可以實現多態,例子如下

Fly[] flys = new Fly[2];

//可以實現多態,只要實現了介面Fly的類的對象都可以用flys中元素指向

flys[0] = new Plane();

flys[1] = new Bird();

但是只能直接訪問該介面中的定義的方法,如果要調用另外一個介面中定義的方法,要進行格式轉換

Sing s = new Plane();

s.sing();

if (s instanceof Fly){ // 飛機實現了Fly,和Sing兩個介面

((Fly)s).fly();

}

u 多個介面,用逗號分隔。例如:class A implements Fly, Sing{};

介面和抽象類的區別?

1.從使用目的來看:介面只是一個類間的協議,它並沒有規定怎麼去實現;抽象類可以重用你代碼使你的代碼更加簡潔;2.從行為來看:介面可以多繼承,multi-implement抽象類不能實例化,必須子類化才能實例化;3.從屬性來看:介面的屬性必須是常量;即publicstaticfinal;抽象類的屬性沒有要求;4.從方法來看:介面的每個方法只是聲明不包括內容;抽象類的方法即可以是抽象的也可以不是抽象的;一般至少有一個是抽象的;


推薦閱讀:

李猛:論抽象社會
中國人的具體感與抽象感
康定斯基與蒙德里安:平行而交錯的抽象雙星
Pedro Paricio| 特里西奧的抽象街頭藝術。

TAG:抽象 |