抽象類
想學好設計模式,首先需要學好,學扎實介面和抽象類;
基本設計原則solid:
- 單一職責原則(SRP)
- 開放封閉原則(OCP)
- 里氏替換原則(LSP)
- 介面隔離原則(ISP)
- 依賴倒置原則(DIP)
總結:
- 什么是介面和抽象類
- 介面和抽象類是“軟體工程產物”
- 具體類-->抽象類-->介面:越來越抽象,內部實作的東西越來越少
- 抽象類是未完全實作邏輯的類(可以有欄位和非public成員,他們代表了“具體邏輯”)
- 抽象類為復用而生:專門作為基類來使用,也具有解耦功能
- 封裝確定的,開放不確定的,推遲到合適的子類中去實作
- 介面是完全未實作邏輯的“類”(“純虛類”;只有函式成員;成員全部public(隱式public))
- 介面為解耦而生:“高內聚,低耦合”,方便單元測驗;
- 介面是一個“協約”,早已為工業生產所熟知(有分工必有協作,有協作必有協約)
- 它們都不能實體化,只能用來宣告變數、參考具體類(concrete class)的實體
抽象類
例子:為做基類而生的“抽象類”與“開放/關閉原則”
abstract class Student{
abstract public void Study();
}
抽象類:函式成員沒有被完全實作的類;(abstract,且一定不能為private)
抽象函式中沒有實作,沒有方法體,沒有花括號;
抽象類不能被實體化;
既然不能實體化,那作用是什么呢?
1、做基類,讓派生類來實作;
2、可以用父類的變數參考子類的實體;
抽象方法在有些編程語言中,也被稱為純虛方法;
開放/關閉原則
開閉原則與抽象類天生一對;
如果不是為了修bug或者加新的功能,不要總是修改一個類的代碼:
-
我們應該封裝一些不便的、穩定的、固定的、確定的成員;
-
那些有可能改變的申明為抽象成員,并且留給子類去實作;
例子:
汽車和卡車都有stop方法,放到一個基類中;
abstract class Vehicle{
public void Stop(){
Console.WriteLine("Stopped!")
}
//這里違反了開閉原則,如果要加新型別的車,就要修改代碼;
public void Run(string type){
if(type == "car"){
Console.WriteLine(Car is running...);
}else if(type == "truck"){
Console.WriteLine("Truck is running...");
}
}
//改成
public virtual void Run(){
Console.WriteLine("Vehicle is running...");
}
//改為
public abstract void Run();
}
class Car:Vehicle{
public override void Run(){
Console.WriteLine("Car is running...");
}
}
class Truck:Vehicle{
//
public override void Run(){
Console.WriteLine("Truck is running...");
}
}
//添加一個賽車,不用動基類中的方法,符合開閉原則
class RaceCar:Vehicle{
//實作抽象類也是用override關鍵字
public override void Run(){
Console.WriteLine("RaceCar is running...");
}
}
class Program{
static void Main(){
//父類變數參考了子類實體
Vehicle v = new Car();//這里v只能呼叫stop方法,有兩種解決方法
//1、用虛方法
v.Run();//這里的結果為Car is running...
Vehicle v2 = new Truck();
v2.Run();//這里的結果為Truck is running...
}
}
一個抽象類里的所有成員都是抽象的;
//純抽象類
abstract class VehicleBase{
abstract public void Stop();
abstract public void Fill();
abstract public void Run();
}
//部分抽象類
abstract class Vehicle:VehicleBase{
public override void Stop(){
Console.WriteLine("Stopped!")
}
public override void Fill(){
Console.WriteLine("Stopped!")
}
}
//car實作了run方法
class Car:Vehicle{
public override void Run(){
Console.WriteLine("Car is running...");
}
}
//純抽象類,在C#中也就是介面
//介面一定是純抽象的,且一定是public
interface IVehicle{
void Stop();
void Fill();
void Run();
}
//部分抽象類
abstract class Vehicle:IVehicle{
//實作介面
public void Stop(){
Console.WriteLine("Stopped!")
}
//實作介面
public void Fill(){
Console.WriteLine("Stopped!")
}
//還有一個沒有實作的,還寫成abstract public
abstract public void Run();
}
參考:劉鐵猛的C#基礎教學視頻
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/285381.html
標籤:.NET技术
上一篇:一探即將到來的 C# 10
下一篇:C#基礎_學習筆記--結構體
