淺談C# 抽象類(lèi)與開(kāi)閉原則
1.抽象類(lèi)與抽象方法:
(1)使用關(guān)鍵字abstract修飾的類(lèi),稱(chēng)為抽象類(lèi).
(2)抽象類(lèi)只是用到一個(gè)類(lèi)所具有的行為,不能單獨(dú)通過(guò)創(chuàng)建對(duì)象來(lái)使用.使用new是錯(cuò)誤的.可以通過(guò)派生類(lèi)來(lái)實(shí)現(xiàn)其函數(shù)成員的具體邏輯。
(3)抽象類(lèi)中可以有抽象方法,也可以沒(méi)有任何抽象方法.只要類(lèi)中存在一個(gè)抽象方法,這個(gè)類(lèi)就是抽象類(lèi)。
(4)抽象類(lèi)不能是靜態(tài)的(static)或者密封的(sealed)
下面就是一個(gè)簡(jiǎn)單的抽象類(lèi)
abstract class Vehicle
{
public abstract void test();
public void VehicleTest()
{
}
}
class Car : Vehicle
{
public override void test()
{
}
}
2.開(kāi)閉原則
如果不是為了修改bug,或者是添加新的功能,不要隨便更改類(lèi)的代碼。
換句話(huà)說(shuō),我們應(yīng)該封裝那些確定的,不變的,穩(wěn)定的,固定的。把不確定的,有可能會(huì)改變的成員聲明為抽象類(lèi),留給子類(lèi)去實(shí)現(xiàn)。
3.我們簡(jiǎn)單實(shí)現(xiàn)了一個(gè)繼承
class Program
{
static void Main(string[] args)
{
Vehicle raceCar = new RaceCar();
Console.ReadKey();
}
}
/// <summary>
/// 交通工具類(lèi)
/// </summary>
class Vehicle
{
/// <summary>
/// 停車(chē)
/// </summary>
public void Stop()
{
Console.WriteLine("Stopped");
}
/// <summary>
/// 加油
/// </summary>
public void Fill()
{
Console.WriteLine("Fill");
}
}
class Car : Vehicle
{
public void Run()
{
Console.WriteLine("Car is running");
}
}
class RaceCar : Car
{
public void Run()
{
Console.WriteLine("RaceCar is running");
}
}
從上面的代碼我們可以看出這是一個(gè)繼承鏈,其中Run方法是根據(jù)不同種類(lèi)的車(chē)來(lái)區(qū)別的,所以我們?nèi)绻雽?shí)現(xiàn)多態(tài),比如 Vehicle raceCar = new RaceCar();此時(shí)raceCar 對(duì)象是調(diào)不到Run方法的,因?yàn)閂ehicle類(lèi)中沒(méi)有這個(gè)方法,以前對(duì)于這種情況的解決方法是在Vehicle中加上Run方法,并且判斷有什么類(lèi)型:
public void Run(string type)
{
if (type == "Car")
{
Console.WriteLine("Car is running");
}
else if (type == "RaceCar")
{
Console.WriteLine("RaceCar is running");
}
else
{
}
}
如上代碼,這樣的話(huà),當(dāng)增加新類(lèi)型的時(shí)候還要再改這個(gè)基類(lèi)中的方法,違反了開(kāi)閉原則( 如果不是為了修改bug,或者是添加新的功能,不要隨便更改類(lèi)的代碼),所以需要做一下修改:
public virtual void Run()
{
Console.WriteLine("RaceCar is running");
}
派生類(lèi)來(lái)重寫(xiě)這個(gè)方法,這樣增加新類(lèi)型的時(shí)候重寫(xiě)就可以,就不用再更改基類(lèi)的代碼了。但是,如果你覺(jué)得這個(gè)類(lèi)中基本不會(huì)調(diào)用這個(gè)Run方法,那我們可以去掉方法體,改成抽象方法,相應(yīng)的類(lèi)也變成抽象類(lèi),Run完全由派生類(lèi)來(lái)重寫(xiě)。
class Program
{
static void Main(string[] args)
{
Vehicle raceCar = new RaceCar();
Console.ReadKey();
}
}
/// <summary>
/// 交通工具類(lèi)
/// </summary>
abstract class Vehicle
{
/// <summary>
/// 停車(chē)
/// </summary>
public void Stop()
{
Console.WriteLine("Stopped");
}
/// <summary>
/// 加油
/// </summary>
public void Fill()
{
Console.WriteLine("Fill");
}
public abstractvoid Run()
{
Console.WriteLine("RaceCar is running");
}
}
class Car : Vehicle
{
public override void Run()
{
Console.WriteLine("Car is running");
}
}
class RaceCar : Car
{
public override void Run()
{
Console.WriteLine("RaceCar is running");
}
}
4.接口與抽象類(lèi)
(1)具體類(lèi)-》抽象類(lèi)-》接口,越來(lái)越抽象,內(nèi)部實(shí)現(xiàn)的類(lèi)越來(lái)越少。
(2)抽象類(lèi)為復(fù)用而生:專(zhuān)門(mén)作為基類(lèi)來(lái)使用,也具有解耦功能。
(3)封裝確定,開(kāi)放不確定的,推遲到子類(lèi)實(shí)現(xiàn)。
(4)接口為解耦而生,高內(nèi)聚,低耦合,方便單元測(cè)試。
(5)都不能實(shí)例化,只能聲明變量,引用具體類(lèi)的實(shí)例。
到此這篇關(guān)于淺談C# 抽象類(lèi)與開(kāi)閉原則的文章就介紹到這了,更多相關(guān)C# 抽象類(lèi)與開(kāi)閉原則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c#實(shí)現(xiàn)將pdf轉(zhuǎn)文本的示例分享
這篇文章主要介紹了c#實(shí)現(xiàn)將pdf轉(zhuǎn)文本的示例,需要的朋友可以參考下2014-03-03
WinForm使用DecExpress控件中的ChartControl插件繪制圖表
這篇文章介紹了WinForm使用DecExpress控件中的ChartControl插件繪制圖表的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
C#窗口轉(zhuǎn)向方式(由一個(gè)窗口,跳轉(zhuǎn)到另一個(gè)窗口)
這篇文章主要介紹了C#窗口轉(zhuǎn)向方式(由一個(gè)窗口,跳轉(zhuǎn)到另一個(gè)窗口)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

