关于C#的那些年

C#——访问基类的成员

2020-01-07  本文已影响0人  大鱼鱼

1.基类与派生类之间的转换
C#允许派生类转换为基类,但不允许把基类转换为派生类。这样,一个基类的对象即可以指向基类的实例,也可以指向派生类的实例。
例如:以下语句都是合法的。
Animal a = new Animal();//a指向基类实例
Animal b = new Dog();//b指向派生类实例
Dog d = new Dog();//d指向派生类实例
a = d;//a指向派生类实例
当基类的对象指向派生的实例的时候,系统将进行隐式转换,把数据类型从派生类转换为基类。例如,在Animal b = new Dog();中,虽然b指向了派生类的实例,但它的数据类型还是基类。此时,若通过基类对象来调用一个基类与派生类都具有的同名的方法,则系统将调用基类的方法,而不会调用派生类的方法。
例如:

public class Animal//这是一个基类
{
         //...其他代码
         public string Eat()//基类的方法
{
                return string.Format("动物{0}:我要吃东西!",name);
}
}
public class Dog:Animal//这是一个派生类
{ 
        //...其它代码
       public new string Eat()//派生类替换基类的方法
{
               return string.Format("狗狗{0}:我要啃骨头!",name);
}
}   

若执行Animal b = new Dog();b.Eat();,则调用Animal中的Eat()方法,因此返回类似动物...:我要吃东西!的信息,而不会返回类似“狗狗...:我要啃骨头”的信息。

当基类的对象指向派生类的实例时,虽然其数据类型被转换成了基类,但其本质仍然没有改变,仍然是派生类的实例,因此可以再次强制转换为派生类型。
Animal a = new Dog()//a指向派生类实例
Dog d = (Dog)a;//把a的类型强制转换为Dog,再赋值给d

  1. 在派生类中调用基类成员
    当派生类重载或者覆盖基类方法后,如果想在派生类中调用基类的同名方法,可以使用base关键字。
    例如,在Dog类的Eat()方法中,希望使用基类的Eat方法,可以通过调用base来实现,代码如下所示:
    public override void Eat(){
    base.Eat();
    }
  2. 类的多态性的意义
    C#允许基类的对象引用派生类的实例,一旦使用virtual和override实现类的多态性,那么系统将具有自适应的能力,它会根据对象所引用的是基类的实例,还是派生类的实例来自动调用覆盖之前还是覆盖之后的方法。这样,对象引用将变得更加灵活。
上一篇下一篇

猜你喜欢

热点阅读