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:抽象 |