C# 封装详解:访问修饰符与面向对象设计最佳实践
封装被定义为"将一个或多个项封装在物理或逻辑包内的过程"。在面向对象编程方法论中,封装隐藏实现细节。
抽象和封装是面向对象编程的相关特性。抽象让相关信息可见,封装则让程序员能够实现所需的抽象级别。
封装通过访问修饰符实现。访问修饰符定义类成员的作用域和可见性。C# 支持以下访问修饰符:
- Public(公共)
- Private(私有)
- Protected(受保护)
- Internal(内部)
- Protected Internal(受保护的内部)
Public 访问修饰符
Public 允许类将成员变量和成员函数暴露给其他函数和对象。任何公共成员均可从类外部访问。
示例
using System;
namespace RectangleApplication {
class Rectangle {
// 成员变量
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());
}
}
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,可通过实例 r 在 Main() 中访问。成员函数 Display() 和 GetArea() 也可直接访问这些变量。
Private 访问修饰符
Private 允许类隐藏成员变量和成员函数,仅同一类内的函数可访问。即使是类的实例也不能访问其私有成员。
示例
using System;
namespace RectangleApplication {
class Rectangle {
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());
}
}
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 无法从 Main() 直接访问,只能通过公共方法 Acceptdetails() 和 Display() 间接操作。
Protected 访问修饰符
Protected 允许子类访问基类的成员变量和成员函数,用于实现继承。详见继承章节。
Internal 访问修饰符
Internal 允许类将成员暴露给当前程序集内的其他函数和对象。即:具有 internal 修饰符的成员可被定义在同一应用程序中的任何类或方法访问。
示例
using System;
namespace RectangleApplication {
class Rectangle {
internal double length;
internal double width;
double GetArea() { // 无修饰符,默认 private
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
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。
Protected Internal 访问修饰符
Protected internal 允许类隐藏成员,除同一应用程序内的子类外。也用于实现继承。
访问修饰符对比表
| 修饰符 | 同一类内 | 同一程序集子类 | 同一程序集非子类 | 其他程序集子类 | 其他程序集非子类 |
|---|---|---|---|---|---|
| public | ✓ | ✓ | ✓ | ✓ | ✓ |
| protected internal | ✓ | ✓ | ✓ | ✓ | ✗ |
| internal | ✓ | ✓ | ✓ | ✗ | ✗ |
| protected | ✓ | ✓ | ✗ | ✓ | ✗ |
| private | ✓ | ✗ | ✗ | ✗ | ✗ |
C语言
- C# 类与对象:面向对象编程的基石
- 理解 C# 访问修饰符:public、private、protected、internal 等完全指南
- C# static 关键字:静态变量、方法与类完全掌握
- 掌握 C# 抽象类与抽象方法:实战指南
- 理解 C# 嵌套类:定义、访问与继承实战
- 理解 C# 分部类与分部方法
- 掌握 C# sealed 类与方法:用法、示例与代码安全性能提升
- C++多态实战指南:虚函数、动态绑定与纯虚函数
- C++数据抽象实战:接口与实现分离的设计艺术
- C++数据封装:守护代码安全的核心机制
- C# 程序结构解析:从 Hello World 看命名空间、类、Main 入口与编译运行
- Java 封装机制:数据隐藏、访问控制与不变量保护