继承即一个类可以派生出新的类,而且新的类能继承基类的成员;多态性是指相同的操作或方法可作用于多种类型的对象,并获得不同的结果,多态性是通过继承来实现的。继承和多态使包括C#在内的所有面向对象语言的本质核心。
继承
如果一个类继承了它的直接基类的成员,这个类就叫做它的基类的子类或者派生类。继承意味着子类隐式的把它的直接基类的所有成员当做自己的成员,但是子类并不能继承基类的构造函数和析构函数。
C#的继承原则
(1)除了类Object,每个类有且只有一个直接基类。
(2)无论基类成员的可访问性如何,除构造函数和析构函数以外,所有其他基类的成员都能被继承。然而,有些继承成员在派生类可能是不可访问的,着取决于基类成员的可访问性。例如基类的private成员也是子类的private成员,但在子类中不可访问。
public class Shape
{
private string comments;
protected string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public Shape()//构造函数
{
}
public Shape(string name)
{
this.name = name;
}
public void Draw()
{
Console.WriteLine("画形状");
}
}
public class Rectangle : Shape
{
protected int width;
protected int height;
public int Width
{
get
{
return width;
}
}
public int Height
{
get
{
return height;
}
}
public Rectangle()
{
}
public Rectangle(int x,int y)
{
width = x;
height = y;
}
public int ComputeArea()
{
return width * height;
}
}
根据上述例子,Rectangle类将继承Shape类的以下成员:
1.comments字段:类型为private,在Rectangle类内部不可见,只在Shape类内可见。
2.name字段:类型protected,在Rectangle类内是可访问的,在类外不可访问。
3.Name属性
4.Draw方法
所以,纪要保证基类的成员在子类中可见,又要保证数据的封装性,那么可以使用protected访问修饰符。如果是基类专有的,是不希望子类看见的,就应该使用private修饰符。
多态
在具有继承关系的类中,不同对象的签名相同的函数成员可以有不同的实现,因而会产生不同的执行结果,着就是多态性。C#的运行多态性通过再子类中重写基类的虚方法或函数成员来实现。
虚方法:实例方法的声明中含有virtual修饰符,它不允许与static,abstract,private或者override修饰符同时使用
重写方法:实例方法声明中含有override修饰符,重写方法用相同的签名重写所继承的虚方法。虚方法声明用于应用新方法,而重写方法声明则使用从基类继承而来的虚方法专用化。重写方法只能用于重写基类的虚方法。