10. 继承
继承是面向对象编程的关键概念
- 基本概念:继承的类自动包含基类所有功能,继承类也可以添加自己独有的功能
语法如下:
class DerivedClass : BaseClass
{
...
public void funcs() //自己独有的方法
{
...
}
}
假如BaseClass里定义了func1, func2, 则在DerivedClass创建了derived对象后,可以很方便的采取如下方法调用
derived.func1(); //调用基类的方法
derived.func2(); //调用基类的方法
derived.funcs(); //调用自身的方法
要注意的是,1个类最多只允许从一个基类派生,不允许以下情况发生:
class DerivedClass : Base1Class
...
class DerviedClass : Base2Class
-
虚方法(virtual)和重写方法(override)是同时出现的
允许调用同一个方法的不同版本,具体取决于运行时动态确定的对象类型,这叫做多态性
如果在基类中有使用virtual
方法,而继承类有override
这个方法,则会使用重写方法,如果没有重写,则还是使用基类的虚方法。 -
虚方法不能私有,必须使用
public
关键字 -
如果派生类不用
override
关键字,就不是重写方法,使和基类方法完全无关的另一个方法。
看下面一个例子就可以充分理解这个特性
class Enemy //基类
{
public void Ai()
{
Console.WriteLine("基类智能系统");
Move();
}
public virtual void Move()
{
Console.WriteLine("基类移动");
}
class Enemy1:Enemy //继承类Enemy1
{
public override void Move()
{
Console.WriteLine("继承类Enemy1移动");
}
}
...
Enemy e1 = new Enemy1();
e1.Ai();
e1.Move();
我们来看下会有什么结果
- 使用了基类Enemy变量引用了派生类Enemy1对象,这是安全的
- Enemy1对象调用Ai()方法,由于派生类没有Ai()方法,所以会调用基类的虚拟方法Ai(),但是Move()方法已经被重写,所以会调用重写后的Move(),即连续两次e1.Move(),结果如下:
基类智能系统
继承类Enemy1移动
继承类Enemy1移动
- 扩展方法
扩展方法允许添加静态方法来扩展现有的类型(包括类和结构)。扩展方法必须在静态类中定义,被扩展的类型必须是方法的第一个参数,而且必须添加this
关键字
必须在文件中添加using Extensions;
语句
看下面一个例子
public static int CovertToBase(this int i, int baseToCovertTo)
这里就添加了一个int变量的扩展方法,在使用时有两种方法,一个是直接在int类型的变量x后使用"."号,调用ConverToBase(i)
方法,注意这里只需要一个参数,一个是使用CoverToBase(i, x)
方法,需要两个参数。
如果是非int类型的变量x,是无法调用ConverToBase(i)
方法的,因为this
关键字后面跟的是int