C# 第十二弹 —————— 虚方法和覆写方法

17 篇文章 1 订阅

关键字virtual和override。

属于继承当中一个很重要的知识点。

先举个栗子吧。

类:BaseClass

class BaseClass
{
   public void Print()
   {
        Console.WriteLine("this is a base class!");
   }
}

类:ChildClass

class ChildClass : BaseClass
{
    new public void Print()
    {
        Console.WriteLine("this is a child class!");
    }
}

类:Program

class Program
{
    static void Main(string[] args)
    {
        ChildClass cc = new ChildClass();
        BaseClass bc = (BaseClass)cc;
        cc.Print();
        bc.Print();
        Console.ReadKey();
    }
}

结果:

可以看出来bc调用的时候出现的结果是基类中的结果。而虚方法和覆写方法就是改变这种情况的,让基类的引用访问升级到子类中,继续代码吧。

类:BaseClass

class BaseClass
{
   virtual public void Print()
   {
        Console.WriteLine("this is a base class!");
   }
}

类:ChildClass

class ChildClass : BaseClass
{
    override public void Print()
    {
        Console.WriteLine("this is a child class!");
    }
}

类:Program

class Program
{
    static void Main(string[] args)
    {
        ChildClass cc = new ChildClass();
        BaseClass bc = (BaseClass)cc;
        cc.Print();
        bc.Print();
        Console.ReadKey();
    }
}

结果:

很完美。

关于virtual和override的注意点说一下:

    1.覆写和被覆写必须有相同的可访问性,比如说被腹覆写的方法不能使private而覆写的方法确实public

    2.不能覆写static或非虚方法

    3.方法,属性和索引器,都可以被声明为virtual和override

再单独的说一下override吧。

    1.当使用对象基类部分的引用调用一个覆写方法的时候,方法的调用会沿着派生层次上溯执行,一直到标记为override的方法的最高派生类。

    2.如果在更高的派生级别有该方法的其他声明,但没有被标记为override,那么它们不会被调用。

举个栗子,eg:

class BaseClass
{
    virtual public void Print()
    {
        Console.WriteLine("this is a base class!");
    }
}
class firstChildClass :BaseClass
{
    public override void Print()
    {
        Console.WriteLine("this is first child class!");
    }
}

class secondChildClass : firstChildClass
{
    public override void Print()
    {
        Console.WriteLine("this is second child class!");
    }
}

类:Program

class Program
{
    static void Main(string[] args)
    {
        secondChildClass scc = new secondChildClass();
        BaseClass bc = (BaseClass)scc;
        bc.Print();
        Console.ReadKey();
    }
}

结果如何呢:

但是当secondChildClass 的Print方法声明为new会出现什么情况呢?

你们自己试一下吧,我就不写出来了,enmmmm。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值