程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【C#學習筆記】二、面向對象編程,

【C#學習筆記】二、面向對象編程,

編輯:C#入門知識

【C#學習筆記】二、面向對象編程,


2.1 抽象類與接口

1)概念

抽象類是特殊的類,只是不能被實例化;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。接口是引用類型的,接口和抽象類實現了oop中的一個原則,把可變的與不可變的分離。抽象類和接口就是定義為不可變的,而把可變的作為子類去實現,接口和抽象類的相似之處有三點:

²        不能實例化;

²        包含未實現的方法聲明;

²        派生類必須實現未實現的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員);

 

2)抽象類和接口的區別

²        類是對對象的抽象,可以把抽象類理解為把類當作對象,抽象成的類叫做抽象類.而接口只是一個行為規范或規定

²        接口基本上不具備繼承的任何具體特點,它僅僅承諾了能夠調用的方法

²        一個類一次可以實現若干個接口,但是只能擴展一個父類

²        接口除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、構造函數、析構函數、靜態成員。一個類可以直接繼承多個接口,但只能直接繼承一個類(包括抽象類)。


3)抽象類和接口的使用:

²        如果預計要創建組件的多個版本,則創建抽象類。抽象類提供簡單的方法來控制組件版本。

²        如果創建的功能將在大范圍的全異對象間使用,則使用接口。如果要設計小而簡練的功能塊,則使用接口。

²        如果要設計大的功能單元,則使用抽象類.如果要在組件的所有實現間提供通用的已實現功能,則使用抽象類。   

²        抽象類主要用於關系密切的對象;而接口適合為不相關的類提供通用功能。


 以下是我在網上看到的幾個形象比喻,真的非常不錯,呵呵:
1.飛機會飛,鳥會飛,他們都繼承了同一個接口“飛”;但是F22屬於飛機抽象類,鴿子屬於鳥抽象類。
2. 就像鐵門木門都是門(抽象類),你想要個門我給不了(不能實例化),但我可以給你個具體的鐵門或木門(多態);  

而且只能是門,你不能說它是窗(單繼承);一個門可以有鎖(接口)也可以有門鈴(多實現)。 門(抽象類)定義了你是什麼,接口(鎖)規定了你能做什麼(一個接口最好只能做一件事,你不能要求鎖也能發出聲音吧(接口污染))。

2.2 接口多態性

假定不使用基類提供EatFood()方法,而是把該方法放到接口IConsume上,Cow和Chicken類也支持這個接口(Cow和Chicken類必須提供EatFood()方法的執行代碼),接著就可以使用下述代碼訪問該方法:

Cow myCow=new Cow();

Chicken myChicken=new Chicken();

IConsume consumeInterface;

consumeInterface=myConw;

consumeInterface.EatFood();

consumeInterface=myChicken;

consumeInterface.EatFood;

2.3 Window應用程序中的OOP(P180)

【例子1】

private void button1_Click(object sender,System.EventArgs e)

{

((CButton)sender).Text=”Clicked!”;  

Button newButton=new Button();

newButton.Text=”New Button!”;

newButton.Click+=new EventHandler(newButton_Click);

Controls.Add(newButton);

}

private void newButton_Click(object sender,System.EventArgs e)

{

    ((Button)sender).Text=”Clicked!”;

}

 

2.4 類的定義(P184)

C#中只能有一個基類,如果繼承了一個抽象類,就必須實現所繼承的所有抽象成員(除非派生類也是抽象的)。一個類可指定多個接口,如:

public class MyClass: MyBase, IMyInterface, IMySecondInterface

{

}

修飾符

                          含義

無或internal

類只能在當前項目中訪問

public

類可以在任何地方訪問

abstract或internal abstract

類只能在當前項目中訪問,不能實例化,只能繼承

public abstract

類可以在任何地方訪問,不能實例化,只能繼承

sealed 或internal sealed

類只能在當前項目中訪問,不能派生,只能實例化

public sealed

類可以在任何地方訪問,不能派生,只能實例化

 

關鍵字abstract和sealed不能在接口中使用,因為這兩個修飾符在接口定義中無意義(接口不包含執行代碼,所以不能直接實例化,且必須是可以繼承的)。接口可使用多個基接口,如:

public interface IMyInterface: IMyBaseInterface, IMyBaseInterface2

{

}

2.5 構造函數執行順序(P192)

public class MyBaseClass

{

public MyBaseClass(){}

public MyBaseClass(int i){}

}

public class MyDerivedClass: MyBaseClass

{

public MyDerivedClass(){}

public MyDerivedClass(int i){}

public MyDerivedClass(int i, int j){}

}

 

MyDerivedClass myObj=new MyDerivedClass();

l         執行System.Object.Object()構造函數。

l         執行MyBaseClass.MyBaseClass()構造函數。

l         執行MyDerivedClass.MyDerivedClass()構造函數。

 

MyDerivedClass myObj=new MyDerivedClass(4);

l         執行System.Object.Object()構造函數。

l         執行MyBaseClass.MyBaseClass(int i)構造函數。

l         執行MyDerivedClass.MyDerivedClass(int i)構造函數。

 

MyDerivedClass myObj=new MyDerivedClass(4,8);

l         執行System.Object.Object()構造函數。

l         執行MyBaseClass.MyBaseClass()構造函數。

l         執行MyDerivedClass.MyDerivedClass(int i,int j)構造函數。

 

若MyDerivedClass的定義做如下修改:

public class MyDerivedClass:MyBaseClass

{

….

public MyDerivedClass(int i, int j) : base(i)

{}

}

則MyDerivedClass myObj=new MyDerivedClass(4,8);其執行順序如下:

l         執行System.Object.Object()構造函數。

l         執行MyBaseClass.MyBaseClass(i)構造函數。

l         執行MyDerivedClass.MyDerivedClass(int i,int j)構造函數。

 

若MyDerivedClass定義作如下修改:

public class MyDerivedClass:MyBaseClass

{

public MyDerivedClass():this(5,6)

{}

public MyDerivedClass(int i, int j) :base(i)

}

則MyDerivedClass myObj=new MyDerivedClass();的執行順序如下:

l         執行System.Object.Object()構造函數。

l         執行MyBaseClass.MyBaseClass(i)構造函數。

l         執行MyDerivedClass.MyDerivedClass(int i,int j)構造函數。

l         執行MyDerivedClass.MyDerivedClass()構造函數。

2.6 定義類成員(P209)

1)成員修飾符

public:   成員可以由任何代碼范圍

private:   成員只能由類中的代碼訪問(如果沒有使用任何關鍵字,就默認使用這個關鍵字)

internal:  成員只能由定義它的項目(程序集)內部的代碼訪問

protected: 成員只能由類或派生類中的代碼訪問

 

2)方法修飾符

static:  只能通過類訪問,不能通過對象實例化來訪問

abstract: 方法必須在非抽象的派生類中重寫(只用於抽象類中)

virtual:  方法可以重寫

override: 方法重寫了一個基類方法(如果方法被重寫,就必須使用該關鍵字)

extern:   方法定義放在其它地方

 

【例子1】字段、屬性與方法

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved