前言
前面有文章寫到了面向?qū)ο缶幊毯兔嫦驅(qū)ο笤O(shè)計(jì)的頭五大原則(SOLID五大原則)。今天我們?cè)賮碚務(wù)劽嫦驅(qū)ο蟮娜筇匦?-封裝、繼承、多態(tài)
封裝
? 被定義為"把一個(gè)或多個(gè)項(xiàng)目封閉在一個(gè)物理的或者邏輯的包中"。在面向?qū)ο蟪绦蛟O(shè)計(jì)方法論中,封裝是為了防止對(duì)實(shí)現(xiàn)細(xì)節(jié)的訪問。
封裝只公開某些對(duì)外接口,隱藏具體實(shí)現(xiàn)細(xì)節(jié)。增加了一定的安全性,防止信息的泄露以及破壞。
講到封裝,我們又得提下訪問修飾符了。
*
* public:所有對(duì)象都可以訪問;
* private:對(duì)象本身在對(duì)象內(nèi)部可以訪問;
* protected:只有該類對(duì)象及其子類對(duì)象可以訪問
* internal:同一個(gè)程序集的對(duì)象可以訪問;
* protected internal:訪問限于當(dāng)前程序集或派生自包含類的類型。
繼承
繼承是軟件復(fù)用的一種形式。使用繼承可以復(fù)用現(xiàn)有類的數(shù)據(jù)和行為,為其賦予新功能而創(chuàng)建出新類。?
在現(xiàn)有類(基類、父類)上建立新類(派生類、子類)的處理過程稱為繼承。派生類能自動(dòng)獲得基類的除了構(gòu)造函數(shù)和析構(gòu)函數(shù)以外的所有成員,可以在派生類中添加新的屬性和方法擴(kuò)展其功能
。
這里繼承又可分為以下系列:
*
* 單重繼承:表示一個(gè)類可以派生自一個(gè)基類,C#采用此繼承
* 多重繼承:多重繼承允許一個(gè)類派生自多個(gè)類,C#不支持多重繼承,但允許接口的多重繼承
* 多層繼承:多層繼承允許有更大的層此結(jié)構(gòu),類B派生自類A,類C派生自類B,其中,類B也稱為中間基類,C#支持它,也很常用。
* 接口繼承:允許接口多重繼承
多態(tài)
多態(tài)指在程序設(shè)計(jì)中存在同名不同方法的存在,主要通過子類對(duì)父類的覆蓋來實(shí)現(xiàn)多態(tài),設(shè)計(jì)原則之一就是要依賴于抽象,而不依賴于具體,增加靈活性。多態(tài)就是為了體現(xiàn)這一原則。
實(shí)例講解
這里我們假設(shè)一個(gè)場(chǎng)景,對(duì)圖形的面積進(jìn)行計(jì)算。在這里我們就抽象一個(gè)基類,形狀。然后其他的設(shè)計(jì)都來繼承它。
類設(shè)計(jì)
/// <summary> /// 抽象類 /// </summary> public abstract class Shape { private
string ShapeName { get; set; } public Shape(string shapeName) { this.ShapeName =
shapeName; }/// <summary> /// 計(jì)算面積 /// </summary> /// <returns></returns>
public abstract double CalculateArea(); } /// <summary> /// 長(zhǎng)方形 /// </summary>
public class Rectangle:Shape { /// <summary> /// 長(zhǎng) /// </summary> public double
Longm {get; set; } /// <summary> /// 寬 /// </summary> public double Widem { get;
set; } public Rectangle():base("Rectangle") { Longm = 0; Widem=0; } public
override double CalculateArea() { return Longm * Widem; } } /// <summary> /// 圓形
/// </summary> public class Circle: Shape { /// <summary> /// 半徑 /// </summary>
public double R { get; set; } public Circle(): base("Circle ") { R = 0; } public
override double CalculateArea() { return Math.PI*R*R; } }
調(diào)用
?
class Program { static void Main(string[] args) { Console.WriteLine("
請(qǐng)選擇計(jì)算面積的圖形:長(zhǎng)方形(A)/圓形(B)"); string answer = Console.ReadLine(); if (answer=="A")
{double longm=0; double widem = 0; try { Console.WriteLine("請(qǐng)輸入長(zhǎng):"); longm =
double.Parse(Console.ReadLine()); Console.WriteLine("請(qǐng)輸入寬:"); widem = double
.Parse(Console.ReadLine()); }catch (Exception) { Console.WriteLine("請(qǐng)輸入數(shù)字!"); }
Rectangle rectangle= new Rectangle(); rectangle.Longm = longm; rectangle.Widem =
widem; Console.WriteLine($"此長(zhǎng)方形的面積是{rectangle.CalculateArea()}"); } else {
double r=0; try { Console.WriteLine("請(qǐng)輸入半徑:"); r = int
.Parse(Console.ReadLine()); }catch (Exception) { Console.WriteLine("請(qǐng)輸入數(shù)字!"); }
Circle circle= new Circle(); circle.R = r; Console.WriteLine($"
此圓形的面積是{circle.CalculateArea()}"); } } }
總結(jié)
本個(gè)案例實(shí)際作用不是很大,主要是方便講解理解封裝繼承多態(tài),在實(shí)例中,對(duì)圖形的名稱封裝,抽象一個(gè)抽象類圖形基類,圓形和長(zhǎng)方形繼承此基類。override
重寫實(shí)現(xiàn)面積計(jì)算的多態(tài)。更多的還是需要在實(shí)際項(xiàng)目中實(shí)際運(yùn)用的。
?
c#基礎(chǔ)知識(shí)詳解系列
<https://www.cnblogs.com/hulizhong/p/11205119.html>
?
歡迎大家掃描下方二維碼,和我一起學(xué)習(xí)更多的C#知識(shí)
?
熱門工具 換一換