从0开始学C#-part 7

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();

我们来看下会有什么结果

  1. 使用了基类Enemy变量引用了派生类Enemy1对象,这是安全的
  2. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值