前言
验项目那天师父问我,面向对象三大特征都有什么呀?“封装、继承、多态”。那分别讲一讲这三大特征吧!我:“enmmmmm……”
确实是这样,要我真的说出来的话,我说不出来,我不能够很好地描述出来,于是我准备在学习一遍。
封装
封装是指将对象的信息进行隐藏,使它的使用者无法看到,而只是提供一个访问接口。在类中,通过不同的修饰符能让类的成员实现公开或隐藏。通过这些修饰符,类实现了很好的封装。封装的主要用途是防止数据收到意外破坏。代码如下:
class Test
{
private int a;
public int wr()
{
return a;
}
public void rd(int value)
{
a = value;
}
}
class Program
{
static void Main(string[] args)
{
Test ts = new Test();
ts.rd(3);
ts.wr();
}
}
以上代码中,使Test类中的私有字段被访问,但又很好地保护了它的数据不被破坏。
当然,封装的内容远不止这些,但是思想是一致的。我们应该注意思想的学习,这样才能很好得应用封装操作。
继承
继承是指一个类A能利用另一个类B的资源(包括属性和方法等),其中类A被称为基类(或父类),而类B被称为派生类(或子类)。继承的用法如下:
class classA
{
public A {}
}
class classB : A
{
public B {}
}
如果类B继承于类A,那么类B能否访问类A中的全部成员呢?答案是否定的。这也是以下要说明的有关派生类在基类中的访问权限问题。
- 大多数而非所有的类都可以作为基类被继承,如带有sealed修饰符的密封类。
- 基类中只有两种成员能够被派生类访问,包括public和protected类型的成员。其中protected类型是专为派生类设计的,该类型的成员只能在派生类中进行访问。
- 在派生类中可以修改基类中的以下成员,包括虚拟成员(virtual)和抽象成员(abstract)。其中对虚拟成员的修改是在派生类中重写该成员的执行代码;而对于抽象成员而言,它在基类中没有执行代码,需要在派生类中进行添加。
下面通过一个简单的例子进行说明,代码如下:
class classF
{
//公有字段
public string name = "张三";
public string age;
//公有属性
public string Age
{
get { return age; }
set { age = value; }
}
}
//虚拟方法
public virtual double Income(double time)
{
double income = time * 100.0 + 2000.0;
return income;
}
在基类F中,定义了一个公有字段、一个公有属性和一个虚拟方法。以下是派生类ClassS的代码。
class ClassS:classF
{
//重写虚拟方法
public override double Income(double time)
{
double income = time * 100.0 + 3000.0;
return income;
}
}
客户端代码
static void Main(string[] args)
{
ClassS c = new ClassS();
Console.WriteLine("姓名:");
//继承公有字段
Console.WriteLine(cs.name);
Console.WriteLine("工时:");
//继承公有属性
cs.Age = Console.ReadKey();
Console.WriteLine("工资:");
//继承虚拟方法
Console.WriteLine(cs.Income(Convert.ToDouble(cs.Age)).ToString);
Console.ReadKey();
}
在派生类ClassS中,调用了ClassF类中的公有字段name、公有属性Age,并重写了虚拟方法Income()。需要注意的是,重写虚拟方法需要用到override关键字。运行程序,结果如下。
姓名:
张三
工时:
30
工资:
6000
多态
多态是面向对象的又一个重要特征,它主要是指同一操作(如方法)作用于不同的类的实例,将产生不同的结果。多态主要是通过在派生类中对基类中的成员进行替换或重定义完成。
下面通过栗子进行说明,代码如下:
//基类
class ClassF1
{
public virtual void Out()
{
Console.WriteLine("调用了基类中的方法!");
}
}
//派生类1
class ClassS1:ClassF1
{
public override void Out()
{
Console.WriteLine("调用了派生类1中的方法!");
}
}
class ClassS2:ClassF1
{
public override void Out()
{
Console.WriteLine(""调用了派生类2中的方法!);
}
}
//输出结果
static void Main(string[] args)
{
ClassF1[] cf = new ClassF1[3];
cf[0] = new ClassF1();
cf[1] = new ClassS1();
cf[2] = new ClassS2();
foreach (ClassF1 c in cf)
{
c.Out();
}
Console.ReadKey();
}
以上代码演示了多态性的实现过程,通过在两个派生类中重写基类中的虚拟方实现。
运行结果
调用了基类中的方法!
调用了派生类1中的方法!
调用了派生类2中的方法!
如果要在派生类中隐藏基类中的非虚成员,可以使用new关键字。
多态的主要作用是提高代码的重用性和简化程序结构。