前言
前面有文章寫到了面向?qū)ο缶幊毯兔嫦驅(qū)ο笤O(shè)計的頭五大原則(SOLID五大原則)朗若。今天我們再來談?wù)劽嫦驅(qū)ο蟮娜筇匦?-封裝恼五、繼承、多態(tài)
封裝
被定義為"把一個或多個項目封閉在一個物理的或者邏輯的包中"哭懈。在面向?qū)ο蟪绦蛟O(shè)計方法論中灾馒,封裝是為了防止對實現(xiàn)細節(jié)的訪問。****封裝只公開某些對外接口遣总,隱藏具體實現(xiàn)細節(jié)睬罗。增加了一定的安全性,防止信息的泄露以及破壞旭斥。
講到封裝容达,我們又得提下訪問修飾符了。
- public:所有對象都可以訪問垂券;
- private:對象本身在對象內(nèi)部可以訪問花盐;
- protected:只有該類對象及其子類對象可以訪問
- internal:同一個程序集的對象可以訪問;
- protected internal:訪問限于當前程序集或派生自包含類的類型菇爪。
繼承
繼承是軟件復(fù)用的一種形式算芯。使用繼承可以復(fù)用現(xiàn)有類的數(shù)據(jù)和行為,為其賦予新功能而創(chuàng)建出新類凳宙。
在現(xiàn)有類(基類熙揍、父類)上建立新類(派生類、子類)的處理過程稱為繼承氏涩。派生類能自動獲得基類的除了構(gòu)造函數(shù)和析構(gòu)函數(shù)以外的所有成員届囚,可以在派生類中添加新的屬性和方法擴展其功能有梆。
這里繼承又可分為以下系列:
- 單重繼承:表示一個類可以派生自一個基類,C#采用此繼承
- 多重繼承:多重繼承允許一個類派生自多個類意系,C#不支持多重繼承淳梦,但允許接口的多重繼承
- 多層繼承:多層繼承允許有更大的層此結(jié)構(gòu),類B派生自類A昔字,類C派生自類B,其中首繁,類B也稱為中間基類作郭,C#支持它,也很常用弦疮。
- 接口繼承:允許接口多重繼承
多態(tài)
多態(tài)指在程序設(shè)計中存在同名不同方法的存在夹攒,主要通過子類對父類的覆蓋來實現(xiàn)多態(tài),設(shè)計原則之一就是要依賴于抽象胁塞,而不依賴于具體咏尝,增加靈活性。多態(tài)就是為了體現(xiàn)這一原則啸罢。
實例講解
這里我們假設(shè)一個場景编检,對圖形的面積進行計算。在這里我們就抽象一個基類扰才,形狀允懂。然后其他的設(shè)計都來繼承它。
類設(shè)計
/// <summary>
/// 抽象類 /// </summary>
public abstract class Shape
{ private string ShapeName { get; set; } public Shape(string shapeName)
{ this.ShapeName = shapeName;
} /// <summary>
/// 計算面積 /// </summary>
/// <returns></returns>
public abstract double CalculateArea();
} /// <summary>
/// 長方形 /// </summary>
public class Rectangle:Shape
{ /// <summary>
/// 長 /// </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("請選擇計算面積的圖形:長方形(A)/圓形(B)"); string answer = Console.ReadLine(); if (answer=="A")
{ double longm=0; double widem = 0; try {
Console.WriteLine("請輸入長:");
longm = double.Parse(Console.ReadLine());
Console.WriteLine("請輸入寬:");
widem = double.Parse(Console.ReadLine());
} catch (Exception)
{
Console.WriteLine("請輸入數(shù)字!");
}
Rectangle rectangle = new Rectangle();
rectangle.Longm = longm;
rectangle.Widem = widem;
Console.WriteLine($"此長方形的面積是{rectangle.CalculateArea()}");
} else { double r=0; try {
Console.WriteLine("請輸入半徑:");
r = int.Parse(Console.ReadLine());
} catch (Exception)
{
Console.WriteLine("請輸入數(shù)字!");
}
Circle circle = new Circle();
circle.R = r;
Console.WriteLine($"此圓形的面積是{circle.CalculateArea()}");
}
}
}
總結(jié)
本個案例實際作用不是很大衩匣,主要是方便講解理解封裝繼承多態(tài)蕾总,在實例中,對圖形的名稱封裝琅捏,抽象一個抽象類圖形基類生百,圓形和長方形繼承此基類。override 重寫實現(xiàn)面積計算的多態(tài)柄延。更多的還是需要在實際項目中實際運用的蚀浆。