位置:首页 > 高级语言 > C#在线教程 > C#封装

C#封装

封装被定义“作为在一个物理或逻辑封装包封一个或多个项目的过程”。封装,面向对象的编程方法,阻止访问的实现细节。

抽象和封装是面向对象编程相关的特性。抽象允许制作相关的信息可见和封装使程序员来实现抽象所需的水平。

封装是通过使用访问修饰符来实现。访问符定义一个类成员的范围和可视度。 C#支持以下访问修辞符:

  • Public

  • Private

  • Protected

  • Internal

  • Protected internal

公共(Public)访问说明符

公共访问说明允许一个类的成员变量和成员函数暴露在其他功能和对象。任何公共成员可以从类的外部访问。

下面的例子说明了这一点:

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 = 4.5;
			r.width = 3.5;
            r.Display();
            Console.ReadLine();
        }
    }
}

让我们编译和运行上面的程序,这将产生以下结果:

Length: 4.5
Width: 3.5
Area: 15.75

在上面的例子中,成员变量的length和width 都声明为public,这样它们就可以使用Rectangle类,命名实例r通过函数main()进行访问。

成员函数Display() 和的getArea()也可以直接访问这些变量不使用类的任何实例。

成员函数Display()也被声明为public,所以从Main()使用Rectangle类,命名为r的一个实例它也可以被访问。

Private访问修辞符

private访问符允许类从其他职能和对象隐藏其成员变量和成员函数。只有同一个类的函数可以访问它的私有成员。即使是一个类的实例不能访问它的私有成员。

下面的例子说明了这一点:

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();
        }
    }
}

让我们编译和运行上面的程序,这将产生以下结果:

Enter Length:
4.4
Enter Width:
3.3
Length: 4.4
Width: 3.3
Area: 14.52 

在上面的例子中,成员变量的length和width都声明为private,所以他们不能从main()函数访问。成员函数AcceptDetails()和Display()可以访问这些变量。由于成员函数AcceptDetails()和Display()被声明public,它们可以从Main()函数中使用Rectangle类,命名为r的一个实例访问。

Protected访问修辞符

Protected访问说明符允许子类来访问其基类的成员变量和成员函数。这种方式有助于实现继承。我们将在继承这一章节详细讨论这个问题。

内部访问说明符

内部访问符允许类的成员变量和成员函数暴露在其他功能和对象在当前汇编。换句话说,使用内部访问说明任何成员都可以从在其中构件被定义在应用程序中定义的任何类或方法来访问。

下面的程序说明了这一点:

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 = 4.5;
            r.width = 3.5;
            r.Display();
            Console.ReadLine();
        }
    }
}

让我们编译和运行上面的程序,这将产生以下结果:

Length: 4.5
Width: 3.5
Area: 15.75

在上面的例子中,注意到成员函数的getArea()不与任何访问说明符声明。那么这将是一个类成员的默认访问说明,如果我们不提任何?这是私有的(private)。

受保护的内部访问说明符

受保护的内部访问符允许一个类从其他类对象和函数隐藏其成员变量和成员函数,除了相同的应用程序中的子类。这是在实现继承也有使用。