C#面向对象——继承


Author:云都小生


继承



在继承关系中,有两种角色,一种称为父类,一种称为子类。就像你与你父母的关系,你就是子类,父母就是父类,父类有时候又称为基类。

C#的继承语法是这样的

class child : father

子类会继承父类的属性和方法。

在菜鸟教程上有一个好例子,我就不客气的挖了过来。

using System;
namespace InheritanceApplication
{
   class Shape 
   {
        protected int width;
        protected int height;

      public void setWidth(int w)
      {
         width = w;
      }
      public void setHeight(int h)
      {
         height = h;
      }
   }

   // 派生类
   class Rectangle: Shape
   {
      public int getArea()
      { 
         return (width * height); 
      }
   }

   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle Rect = new Rectangle();

         Rect.setWidth(5);
         Rect.setHeight(7);

         // 打印对象的面积
         Console.WriteLine("总面积: {0}",  Rect.getArea());
         Console.ReadKey();
      }
   }
}、

在Shape中封装了两个属性,用protected来修饰,表示这两个属性只有该类与它的子类能访问。

你可以看到Rectangle方法在定义的时候,后面加了一个“:Shape”,表示这个类从Shape继承。然后我们又注意到,Rectangle根本没有定义setWidth、setHeight方法,但是为什么创建了Rectangle对象,却有setWidth、setHeight方法。

这就是继承的功劳,子类能够继承基类的部分属性和方法。

C#与Java一样,不支持多继承,支持多重继承。


基类构造函数



在封装的那一节,我们已经了解了构造方法,通常我们都会用构造方法在对象创建的时候,就可以进行一些初始化的操作。那如果我们在创建子类对象的时候,想顺便对父类进行某些操作,这个时候我们可以这样···

public Child(double a, double b) : base(a, b){}

假设这个Child是从Father继承的,而base就会指向父类,我们可以用这个关键字来对父类进行初始化操作。


虚函数、纯虚函数



首先说说虚函数是什么,虚函数值的是 为了重载和多态的需要,在基类中是有定义的,即便定义是空,子类中可以重写也可以不重写基类中的此函数。

再说说纯虚函数,有点类似Java中接口的方法,纯虚函数在基类中定义了,子类就必须实现。

虚函数的声明是这样的:virtual void Eat(){};

纯虚函数的声明是这样的:virtual void foo2() = 0;

在C++中有虚函数和纯虚函数的概念,在Java中并没有纯虚函数这个概念,Java有接口,但是没有纯虚函数。


重载



方法重载是指: 一个方法在同一个类中,有多个同名但参数不同的方法。

public void Test()
{
    ···
}

public void Test(string id)
{
    ···
}

public void Test(int id)
{
    ···
}

这种就叫做方法重载。


重写



首先我们要认识两个关键字,这两个关键词跟重写有关,一个是virtual,另外一个是override。

在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。

在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。

父类的方法如果用virtual修饰,那么它就是一个虚函数。虚函数可以被重写也可以不重写,重写的方式是在子类同个方法中增加一个override方法。

class Animal
{ 
    public virtual void test()
    {
      Console.WriteLine("父类方法");
    }
}  

class Cat : Animal
{
    public override void test()
    {
        Console.WriteLine("子类方法");
    }
}

class Test
{
    static void Main()
    {
        Cat cat = new Cat();
        cat.test();
    }
}

请记住,重写之后,父类的方法就没办法调用了,已经失去了功能了。

class Test
{
    static void Main()
    {
        Animal animal = new Cat();
        animal.test();
    }
}


覆盖/覆写



其实在Java中重写和覆盖并没有什么区别,但是在C#中就有区别了。首先我们要认识另外一个关键字——new。我们之前经常用new来创建对象,但是这个new在方法定义的时候也有作用哦。

class Animal
{ 
    public virtual void test()
    {
      Console.WriteLine("父类方法");
    }
}  

class Cat : Animal
{
    public new void test()
    {
        Console.WriteLine("子类方法");
    }
}

class Test
{
    static void Main()
    {
        Animal animal = new Cat();
        animal.test();
        Cat cat = new Cat();
        cat.test();
    }
}

子类如果想覆盖父类的方法,又或者说,想自己写个同名的方法,但是不想把父类的那个方法被覆盖掉,就可以用new关键字来修饰。

2017/12/15 22:17:03 @Author:云都小生

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值