封裝是一種被定義為在物理或邏輯包中包含一個(gè)或多個(gè)項(xiàng)目的過程。封裝在面向?qū)ο蟮木幊谭椒ㄖ校怯脕碜柚乖L問具體的實(shí)現(xiàn)細(xì)節(jié)。
抽象和封裝是面向?qū)ο缶幊讨械南嚓P(guān)特征。抽象允許相關(guān)信息可見,封裝使程序員能夠?qū)崿F(xiàn)所需的抽象級(jí)別。
封裝通過使用訪問說明符來實(shí)現(xiàn)。訪問說明符定義了一個(gè)類成員的范圍和可見性 C# 支持以下訪問說明符:
公共訪問說明符允許類將成員變量和成員函數(shù)公開到其他函數(shù)和對(duì)象。任何公共會(huì)員都可以從類的外部來訪問。
以下示例說明了這一點(diǎn):
using System;
namespace RectangleApplication
{
class Rectangle
{
//member variables
public double length;
public double width;
public double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}//end class Rectangle
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.length = 14.5;
r.width = 10.5;
r.Display();
Console.ReadLine();
}
}
}
當(dāng)編譯和執(zhí)行上述代碼時(shí),會(huì)產(chǎn)生以下結(jié)果:
Length: 14.5
Width: 10.5
Area: 152.25
在前面的例子中,成員變量:length
和width
被聲明為public
,因此可以使用名為r
的Rectangle
類的實(shí)例從Main()
函數(shù)訪問它們。
成員函數(shù)Display()
和GetArea()
也可以直接訪問這些變量,而不用通過該類的任何實(shí)例。
成員函數(shù)Display()
也被聲明為public
,因此也可以使用名為r
的Rectangle
類的實(shí)例從Main()
訪問它。
私有訪問說明符允許類從其他函數(shù)和對(duì)象中隱藏其成員變量和成員函數(shù)。只有同一個(gè)類的函數(shù)才能訪問其私有成員。即使是類的實(shí)例也無法訪問其私有成員。
以下示例說明了這一點(diǎn):
using System;
namespace RectangleApplication
{
class Rectangle
{
//member variables
private double length;
private double width;
public void Acceptdetails()
{
Console.WriteLine("Enter Length: ");
length = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter Width: ");
width = Convert.ToDouble(Console.ReadLine());
}
public double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}//end class Rectangle
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.Acceptdetails();
r.Display();
Console.ReadLine();
}
}
}
當(dāng)編譯和執(zhí)行上述代碼時(shí),會(huì)產(chǎn)生以下結(jié)果:
Enter Length:
12.5
Enter Width:
8.25
Length: 12.5
Width: 8.25
Area: 103.125
在前面的例子中,成員變量:length
和width
被聲明為私有的,所以不能從函數(shù)Main()
訪問它們。成員函數(shù)AcceptDetails()
和Display()
可以訪問這些變量。由于成員函數(shù)AcceptDetails()
和Display()
被聲明為public
,因此可以使用名為r
的Rectangle
類的實(shí)例從Main()
訪問它們。
受保護(hù)的訪問說明符允許子類訪問其基類的成員變量和成員函數(shù)。這樣就有助于實(shí)現(xiàn)繼承。我們將在后續(xù)章節(jié)中詳細(xì)討論。
內(nèi)部訪問說明符允許類將其成員變量和成員函數(shù)公開到當(dāng)前程序集中的其他函數(shù)和對(duì)象。換句話說,具有內(nèi)部訪問說明符的任何成員都可以從定義成員的應(yīng)用程序中定義的任何類或方法訪問。
以下程序說明了這一點(diǎn):
using System;
namespace RectangleApplication
{
class Rectangle
{
//member variables
internal double length;
internal double width;
double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}//end class Rectangle
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.length = 12.5;
r.width = 8.25;
r.Display();
Console.ReadLine();
}
}
}
當(dāng)編譯和執(zhí)行上述代碼時(shí),會(huì)產(chǎn)生以下結(jié)果:
Length: 12.5
Width: 8.25
Area: 103.125
在上面的示例中,請(qǐng)注意,成員函數(shù)GetArea()
沒有使用任何訪問說明符聲明。如果沒有使用任何一個(gè)訪問說明符的類成員,它的默認(rèn)訪問說明符是什么呢? 默認(rèn)使用的是私有的。
受保護(hù)的內(nèi)部訪問說明符允許類從其他類對(duì)象和函數(shù)中隱藏其成員變量和成員函數(shù),但同一應(yīng)用程序中的子類除外。這也是在實(shí)現(xiàn)繼承時(shí)要使用的。