现实生活中的事物都归属于一定的类别,比如,狮子是一种(IS_A)动物,为了在计算机中模拟这种关系,面向对象的语言引入了继承(inherit)特性。
构成继承关系的两个类中,Animal称为父类(parent class)或基类(base class),Lion称为子类(child class)。
父类与子类之间拥有以下两个基本特性:
1.是一种(IS_A)关系:子类是父类的一种特例。
2.扩充(Extends)关系:子类拥有父类所没有的功能。
class Animal
{
}
class Lion : Animal
{
}
可以看到,C#中用一个冒号间隔开父类和子类。
类成员的访问权限
面向对象编程的一大特性就是可以控制类成员的可访问性。当前主流的面向对象语言都拥有以下三种基本的可访问性
继承条件下的类成员访问权限
1.所有不必让外人知道的东西都是私有的。
2.所有需要向外提供服务都是公有的。
3.所有的“祖传秘方”,“秘不外传”的都是保护的。
internal
关键字internal所确定的“内部”访问性。
internal有点像public,外界类也可以直接访问声明为internal的类或类的成员。但这只局限于同一个程序集中。
internal是C#默认可访问性,就是说,如果某个类没有任何可访问性关键字在它前面的则是internal。
方法重载、隐藏域虚方法调用
子类方法与父类方法之间的关系可以概括以下三种:
1.扩充(Extend):子类方法,父类没有;
2.重载(Overload):子类有父类的同名函数,但参数类型或数目不一样;
3.完全相同:子类方法与父类方法从方法名称到参数类型完全一样。
在子类与父类中方法完全相同的情况下,调用哪个方法有对象变量的类型决定。
重写(override)与虚方法调用
class Animal
{
public virtual void OverrideF()
{
System.Console.WriteLine("Animal OverideF");
}
}
class Lion : Animal
{
public override void OverrideF()
{
System.Console.WriteLine("Lion OverideF");
}
}
static void Main(string[] args)
{
Lion lion = new Lion();
Animal animal;
animal = lion;
animal.OverrideF();
Console.ReadKey();
}
结果为:
Lion OverideF
在animal引用不同对象是,其运用的结果可能完全不一样,因此我们在编程时只针对父类变量提供的对外接口编程,就使我们的代码成了“变色龙”,传给它不同的子类对象,就干不同的事。
这就是面向对象的“虚方法调用(Virtual Method Invoke)”特性。
面向对象语言拥有的“虚方法调用”特性,使我们可以只用同样的一个语句,在运行时根据对象类型而执行不同的操作