封装 (Encapsulation)

简介

封装是一种将类中不必要的信息对外隐藏的手段,防止用户以非设计者意图的方式操作对象。

  • **公共(public)**成员:向所有代码公开,表示类对外允许的操作。
  • **私有(private)**成员:表示类的内部状态(如变量)或禁止外部用户访问的操作。private 是类和结构成员的默认访问修饰符。

示例:

public class Frog
{
    private int _height = 0;

    // 公共方法
    public void JumpLow() { Jump(1); }
    public void JumpHigh() { Jump(10); }

    // 私有方法
    void Jump(int height) { _height += height; }
}

在此示例中:

  • JumpLowJumpHighFrog 类向外暴露的公共方法。
  • Jump 方法和 _height 变量是私有的,外部无法直接访问。

访问修饰符 (Protection Levels)

1. 私有(private

  • 私有成员只能在类内部访问。
  • 如果未指定访问修饰符,类成员默认是 private

示例:

namespace PrivateSample
{
    public class Person
    {
        private string _name;

        public Person(string name)
        {
            this._name = name; // 私有成员只能由类内部的构造函数或方法修改
        }
    }

    public class Entry
    {
        static void Main(string[] args)
        {
            Person person = new Person("Samanta");
            // person._name = "Sam"; // 错误:无法访问私有成员
        }
    }
}

2. 受保护(protected

  • 受保护成员可以被类本身及其派生类访问。

示例:

namespace ProtectedSample
{
    public class Person
    {
        protected string _name;
    }

    public class Warrior : Person
    {
        public void SetName(string name)
        {
            base._name = name; // 派生类可以访问受保护成员
        }
    }

    public class Entry
    {
        static void Main(string[] args)
        {
            Warrior warrior = new Warrior();
            warrior.SetName("Glades"); // OK
            // warrior._name = "Sam"; // 错误:无法直接访问受保护成员
        }
    }
}

3. 公共(public

  • 公共成员可以被任意类中的方法访问。

示例:

namespace PublicSample
{
    public class Person
    {
        public string Name;
    }

    public class Entry
    {
        static void Main(string[] args)
        {
            Person person = new Person();
            person.Name = "Debora"; // OK,公共成员可被外部访问
        }
    }
}

注意:出于良好的编程习惯,不建议直接暴露变量,尤其是那些需要通过 getter 和 setter 方法访问的字段。


4. 内部(internal

  • 内部成员只能在同一程序集内访问。
  • 如果顶级类未指定访问修饰符,默认是 internal

示例:

namespace InternalSample
{
    public class Person
    {
        internal string Name;
    }

    public class Entry
    {
        static void Main(string[] args)
        {
            Person person = new Person();
            person.Name = "Debora"; // OK,同一程序集内可以访问
        }
    }
}

5. 受保护的内部(protected internal

  • 受保护的内部成员可以在同一程序集内访问,或者被派生类访问。

示例:

namespace InternalSample
{
    public class Person
    {
        protected internal string Name;
    }

    public class Entry
    {
        static void Main(string[] args)
        {
            Person person = new Person();
            person.Name = "Debora"; // OK,在同一程序集内可以访问
        }
    }

    public class Book : Person
    {
        public void Display()
        {
            Console.WriteLine(this.Name); // OK,派生类可以访问
        }
    }
}

总结

访问修饰符 访问范围
private 只能在类内部访问。
protected 只能在类本身及其派生类中访问。
public 在任意位置均可访问。
internal 只能在同一程序集内访问。
protected internal 同一程序集内或派生类中均可访问。

通过使用合适的访问修饰符,可以有效地实现封装,保护类的内部状态,避免外部用户以非预期方式修改或访问类的成员。

最后修改: 2025年01月11日 星期六 23:06