1.定義:
軟體實體(包括類、模組、函式)應該為擴充套件而開啟,為修改而關閉。
大概意思就是:乙個軟體實體應該通過擴充套件來實現變化,而不是通過修改原有的**來實現變化
2.實現:
開閉原則實現關鍵是抽象
抽象基類:把系統的所有可能的行為抽象成乙個抽象底層,這個抽象底層規定出所有的具體實現必須提供的方法的特徵。作為系統設計的抽象層,要預見所有可能的擴充套件,從而使得在任何擴充套件情況下,系統的抽象底層不需修改
派生類:從抽象基類派生乙個或多個新的具體實現,可以擴充套件基類的行為,系統設計對擴充套件開放
3.使用:
通過介面或者抽象類約束擴充套件,對於擴充套件進行邊界限定
引數型別、引用物件盡量使用介面或者抽象方法,而不是實現類
抽象層應該保持穩定和可靠,一但確認即不允許修改
4.優點:
可復用、可維護
5.抽象方法示例:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace ocp.study.abstract
/// /// 面積
///
///
public abstract double area();
/// /// 顯示
///
public abstract void display();
}}
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace ocp.study.abstract
public override double area()
public override void display()
的面積是");}}
}
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace ocp.study.abstract
public override double area()
public override void display()
的面積是");}}
}
using ocp.study.abstract;
using ocp.study.inte***ce;
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace ocp.study
}catch (exception ex)
console.readkey();}}
}
6.介面示例:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace ocp.study.inte***ce
}
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace ocp.study.inte***ce
public int getid()
public string getname()
public double getprice()
}}
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace ocp.study.inte***ce
public double getdiscount()
}}
using ocp.study.abstract;
using ocp.study.inte***ce;
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace ocp.study
catch (exception ex)
console.readkey();}}
}
7.簡單說一下抽象類和介面的區別
抽象類:
不能例項化
可以包含抽象方法和抽象訪問器(一但包含了抽象方法就必須宣告成抽象類)
不能用sealed修飾符(阻止其他類繼承自該類)修飾抽象類,因為兩個修飾符的含義相反,sealed
修飾符阻止類被繼承,而abstract
修飾符要求類被繼承
從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實際實現
介面:不能被例項化
只能包含方法宣告
介面的成員包括方法、屬性、索引器、事件(不能包含常量、字段、靜態成員、建構函式、析構函式)
相同點:
都不能被例項化
都可以被繼承
都可以包含方法宣告
派生類必須實現為實現的方法
區別:抽象類中可以包含靜態方法、構造方法、普通成員變數,而介面沒有
乙個類可以繼承多個介面、但只能繼承乙個抽象類
介面可以被多重實現、抽象類只能被單一繼承
如果抽象類實現介面,則可以把介面中方法對映到抽象類中作為抽象方法而不必實現,而在抽象類的子類中實現介面中方法
8.屬性和字段的區別
屬性是對字段的封裝,在字段上新增了get、set兩個方法
屬性從實質上就是一種方法,而字段是用來存資料的
程式設計六大原則
目錄 單一職責原則 single responsibility principle 開閉原則 open closed principle 黎克特制替換原則 liskov substitution principle 依賴倒置原則 dependence inversion principle 介面隔離...
六大原則之開閉原則
軟體實體應當對擴充套件開放,對修改關閉 software entities should be open for extension,but closed for modification 這就是開閉原則的經典定義。開閉原則的含義是 當應用的需求改變時,在不修改軟體實體的源 或者二進位制 的前提下,...
程式設計六大原則之介面隔離原則
定義 客戶端不應該依賴他不需要的介面 類間的依賴關係應該建立在最小的介面上 簡而言之 要為各個類建立他們需要的專用介面,而不要試圖建立乙個很龐大的介面供他們呼叫 介面隔離原則是對介面的使用進行約束規範的乙個原則 優點 將龐大的介面分解為多個粒度小的介面,可以預防外來變更的擴散 避免介面汙染 提高系統...