C#封装
封装,它是把一个或多个项目封闭在一个物理的或逻辑的包中。
抽象与封装是面向对象程序设计的相关特性,抽象允许相关信息可视化,封装则允许程序员实现所需级别的抽象。
封装使用访问修饰符来实现,它定义了类中成员的范围和可视性
C#支持的访问修饰符如下:
public
private
protected
internal
protected internal
public访问修饰符
公有访问权限,它允许一个类把它的成员变量和成员函数暴露给到其它的函数和对象。任何公有成员都可以被外部访问。
新建项目 Chapter05_001
在生成的项目中新建一个类 Student
class Student
{
/*成员变量*/
private long id; //学生学号
private string school_name; //学校名称
private string stu_name; //学生名称
private string addr; //住址
private ArrayList marjor_course; //主修课程
private ArrayList elective_course; //选修课程
/*成员函数*/
public Student(long id, string sch_name, string stu_name,string addr,ArrayList m_course,ArrayList e_course)
{
this.id = id;
this.school_name = sch_name;
this.stu_name = stu_name;
this.addr = addr;
this.marjor_course = m_course;
this.elective_course = e_course;
}
/*获取用户学号*/
private long GetId()
{
return this.id;
}
public void Display()
{
Console.WriteLine("学生基本信息如下:");
Console.WriteLine("学号:{0}",this.GetId());
Console.WriteLine("姓名:{0}", this.stu_name);
Console.WriteLine("学校:{0}", this.school_name);
Console.WriteLine("住址:{0}", this.addr);
Console.WriteLine("学生学习课程信息如下:");
Console.Write("主修课程:");
foreach (string m in this.marjor_course)
{
Console.Write(m + "\t");
}
Console.WriteLine();
Console.Write("选修课程:");
foreach (string m in this.elective_course)
{
Console.Write(m + "\t");
}
Console.WriteLine();
}
}
在Main函数所在的类中创建一个类对象并调用对象中的成员函数
class Program
{
static void Main(string[] args)
{
ArrayList mList = new ArrayList();
mList.Add("计算机概论");
mList.Add("数据结构");
mList.Add("C++程序设计");
mList.Add("电子电路");
mList.Add("高等数学");
mList.Add("软件工程");
ArrayList eList = new ArrayList();
eList.Add("项目管理");
eList.Add("统筹学");
eList.Add("文学");
Student stu = new Student(1,"西安交通大学","谢声","湖南省",mList,eList);
stu.Display();
Console.ReadKey();
}
}
以上程序在编译执行后的结果如下:
在上面的实例中我们可以看到,类中的构造函数Student、Display、GetId都是被声明为public的,所以Main方法中可以使用Student类对象stu访问。
private访问修饰符
private访问修饰符允许一个类把它的成员变量和成员函数隐藏起来,只有同一类中的函数可以访问私有成员,类的实例是不允许访问私有成员变量和面员函数的。
还是上面的例子,上面的成员变量都是私有的
private long id; //学生学号
private string school_name; //学校名称
private string stu_name; //学生名称
private string addr; //住址
private ArrayList marjor_course; //主修课程
private ArrayList elective_course; //选修课程
当我们使用对象stu直接访问这些成员变量时,如下语句在Main中会提示错误
Console.WriteLine(stu.stu_name);
同理私有的成员函数也是不可以由对象stu直接访问的,如下语句在Main中会提示错误
Console.WriteLine(stu.GetId());
protected访问修饰符
protected访问修饰符允许子类访问它的基类的成员变量和成员函数,这样有助于实现继承。
Internal访问修饰符
Internal访问修饰符允许一个类把其成员变量和成员函数暴露给当前序中的其它函数和对象,也就是说带有Internal访问修饰符的任何成员可以被定义在这个成员所定义的应用程序内的任何类或方法访问。
比如我们把上面程序代码中成员变量 stu_name修饰符改为 Internal,也就是说
private string stu_name; 改为:internal string stu_name;
把GetId()成员函数private修饰符改为 internal,也就是说
private long GetId()
{
return this.id;
}
改为:
internal long GetId()
{
return this.id;
}
这样的话在Main方法所在的类中声明Student类对象stu并访问 stu_name成员变量和GetId()成员函数时则不会报错
protected internal访问修饰符
这个修饰符允许一个类把它的成员变量和成员函数,对同一应用程序内的子类以外的其它类对象和函数进行隐藏,这个也用于实现继承。