物件導向編程(OOP,Object(對象) Oriented(面向) Programming(編程))
是將現實世界中的概念類比到電腦程式中,它將現實世界中的所有事物視為對象。
萬物皆對象 類為產品的藍圖,對象為一個產品。
blueprint manufacture = new blueprint();
例如一輛汽車 屬性有顏色,速度;方法有加速,減速。
class Car //定義一個Car類
{
string color; //顏色
int speed; //速度
void speedup() //加速
{
//語句;
}
void slowDown() //減速
{
//語句;
}
}
我們平日要看電視,只需會用遙控器就可以了,而無需瞭解電視的內部構造。
這種內部資訊的隱藏就叫做‘封裝’
public class TV //定義一個TV類
{
string image=黑白; //映像
string sound=立體聲; //聲音
void inner() //內部構造
{
//語句;
}
}
存取修飾詞
public 可被所屬類的成員以及不屬於類的成員訪問
internal 可被當前程式集訪問
protected 可被所屬類或衍生類別的類型訪問
private 僅所屬類的成員才可以訪問
電視機從黑白到彩色再到高清晰,無論怎麼變都會有映像與聲音,下一代繼承上一代的特點並有所發展。
這個就叫做‘繼承’
class ClearTV:TV //定義衍生類別ClearTV繼承於基類TV
{
string image2=高清晰;
}
電視機無論如何升級換代,但是舊的VCD依然可以插在最新的電視機上,這個就說明電視機的介面是穩定的。
‘介面’就是某些事物對外提供的一些功能的聲明。
public interface VCD
{
void Play() //播放
{
//語句;
}
}
注意:實現介面的文法與實現繼承一樣,同樣使用(冒號) :
一個類派生自另一個類,也可以實現介面
class ClearTV:TV,VCD //TV類與VCD介面派生出ClearTV類
{
string ClearImage=高清晰;
}
如果兩個介面內部有同樣的方法名,那該如何調用呢,這時候就需要使用到顯式介面。
public interface DVD
{
void Play() //播放
{
//語句;
}
}
class ClearTV:TV,VCD,DVD //TV類與VCD介面與DVD介面派生出ClearTV類
{
string image2=高清晰;
void VCD.Play() //VCD播放
{
//語句;
}
void DCD.Play() //DVD播放
{
//語句;
}
}
一個洗衣機可以根據放進衣服的骯髒程度來判斷所需的洗滌時間,這種功能就叫做多態。
方法重載
public class Washer //洗衣機
{
void abstersion(int cleanlily) //乾淨衣服的洗滌方法
{
//語句;
}
void abstersion(long dinginess) //骯髒衣服的洗滌方法
{
//語句;
}
}
方法重寫
我想把騎單車的速度變成汽車那麼快
class bicycle
{
public virtual void career() //該方法支援重寫
{
Console.WriteLine("每小時10公裡");
}
}
class Car:bicycle
{
public override void career() //重寫
{
Console.WriteLine("每小時200公裡");
}
}
抽象方法
抽象方法的目的在於指定衍生類別必須實現與這一方法關聯的行為。
abstract class ABC //抽象類別abc
{
public abstract void AFunc(); //抽象方法
}
class Derv:ABC //衍生類別
{
public override void AFunc() //使用 override關鍵字可在衍生類別中實現抽象方法
{
Console.WriteLine("實現抽象方法");
}
}
基類實現了抽象類別,則衍生類別不需要重新實現該抽象類別。
abstract class MyAbs //抽象類別
{
public abstract void AbMethod();
}
class MyClass:MyAbs //衍生類別
{
public override void AbMethod()
{
Console.WriteLine("在MyClass中實現的抽象方法");
}
}
class SubMyClass:MyClass //派生自MyClass的子類
{
public void General()
{
Console.WriteLine("在SubMyClass中未實現的抽象方法");
}
}
class MyClient
{
static void Main()
{
SubMyClass objSubClass = new SubMyClass();
objSubClass.General();
}
}
如果你還認為輸出結果是:
在MyClass中實現的抽象方法
在SubMyClass中未實現的抽象方法
那就錯了!。
正確輸入結果:
在SubMyClass中未實現的抽象方法
記住 衍生類別不需要重新實現該抽象類別!
編程高手不是看原理看出來的,而是靠代碼打出來的。我也用所學練習一下。
建立一個Shape類,此類包含一個名為_color的資料成員(用於存放顏色值)和一個getColor()方法(用於擷取顏色值)。這個類還包含一個名為getArea()的抽象方法。用這個類建立名為Circle(圓形)和Square(正方形)的兩個子類,這兩個類都包含兩個資料成員,即_radius和_sideLen 這些衍生類別應提供getArea()方法的實現,以計算相應形狀的面積。
abstract class Shape
{
public string _color;
public void getColor()
{
Console.WriteLine("輸入顏色:");
this._color = Console.ReadLine();
}
public abstract void getArea();
}
class Circle : Shape
{
double _radius;
double _sideLen=3.14;
public override void getArea()
{
Console.WriteLine("輸入圓形半徑:");
this._radius = double.Parse(Console.ReadLine());
Console.WriteLine("顏色為{0},面積為{1}的圓形", _color, _radius * _sideLen);
}
}
class Square : Shape
{
double _radius;
public override void getArea()
{
Console.WriteLine("輸入正方形邊長:");
this._radius = double.Parse(Console.ReadLine());
Console.WriteLine("顏色為{0},面積為{1}的正方形", _color, _radius * _radius);
}
}
class Test
{
static void Main()
{
Circle objCircle = new Circle();
Square objSquare = new Square();
objCircle.getColor();
objCircle.getArea();
objSquare.getColor();
objSquare.getArea();
}
}
控制台輸出:
輸入顏色:
blue
輸入圓形半徑:
5
顏色為blue,面積為15.7的圓形
輸入顏色:
red
輸入正方形邊長:
5
顏色為red,面積為25的正方形