在C#中对类进行封装是常见的,而封装指的是类内部的数据隐藏起来,不让对象实例直接对其进行操作。封装可以通过public、private、protected和internal等关键字来实现。那如果不把字段定义封装起来,使它为公共类型时,外部对象可以对类内部的数据进行任意的操作,就有可能导致当前值不符合系统的业务逻辑。
在以下代码,Person的_age属性没有引起编译错误,但是是不符合业务逻辑的,因为人的年龄不可能为负值,这是不把类的字段封装起来,导致部对象可以对类内部的数据进行任意的操作,而发生的问题
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person._name = "MJ";
person._age = -1;
}
}
}
class Person
{
public string _name;
public int _age;
}
利用封装,就可以有效的对外部隐藏内部的数据,不能使外部直接操作内部数据,从而避免了数据损坏,也可以加入一些逻辑判断,使得数据完整。如果在操作不符合逻辑时,会捕获一个异常会进行相关的处理操作
class Person
{
private string _name;
private int _age;
public string Name
{
get { return _name; }
set { _name = value; }
}
public int Age
{
get { return _age; }
set
{
if (value < 0 || value > 130)
{
throw (new ArgumentOutOfRangeException("Age", value, "年龄须在0-130以内"));
_age = value;
}
}
}
}
类与类之间也可进行继承,C#仅支持派生于一个基类,也能够继承多个接口。在子类继承父类时,子类可以继承父类中的属性,但并不能对父类的私有成员进行直接访问,子类可以通过调用公有或保护方法来间接的对私有成员进行访问。但是密封类是不可以被另一个类继承的,强行继承就会报出错误
使用了继承之后,当初始化一个子类时,除了会调用子类的构造函数外,同时也会调用基类的构造函数。子类的初始化顺序为:
子类的静态字段
子类的静态构造方法
子类的实例字段
父类的静态字段
父类的静态构造方法
父类的实例字段
父类的实例构造方法
子类的实例构造方法