C#学习之Abstract和Virtual的区别

坚持 成长 每日一篇

这里主要讲的是C#中重写方法主要用的关键字分别代表的意义

virtual,abstract是告诉其它想继承于他的类 你必须通过override来重写我的这个方法或属性,否则会有警告。

Virtua:当一个方法被声明为Virtual时,它是一个虚拟方法,直到你使用ClassName variable = new ClassName();声明一个类的实例之前,它都不存在于真实的内存空间中。这个关键字在类的继承中非常常用,用来提供类方法的多态性支持。

abstract:表示声明的方法为抽象方法。具体使用参考http://blog.csdn.net/u014410695/article/details/48265209

override:是重写(有的翻译为覆盖),重写的是函数签名相同的方法(函数名相同,函数参数,返回类型相同),重载是同名的方法。
new:是则是新建一个与父类同名的方法,并没有发生覆盖,当以父类的类型引用子类实例时候,会调用父类的方法,而不是new出来的方法。

重写注意事项

1.不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。
2.override修饰的方法也是可以重写的,因为基类中的 override 实际上是对基类的基类进行的重写,由于继承可传递,所以也可以对基类中 override 的方法进行重写。
3.override 声明不能更改 virtual 方法的可访问性。override 方法和 virtual 方法必须具有相同的访问级别修饰符。
4.不能使用修饰符 new、static、virtual 或 abstract 来修饰 override 方法。
5.重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。

using System;

namespace C中Abstract和Virtual
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Console.WriteLine ("Hello World!");

            //无论是virtual还是new都能实现修改父类方法
            Animals animals = new Animals ();
            animals.Speack ();
            animals.Run ();

            Human human = new Human ();
            human.Speack ();
            human.Run ();

            //new 和override修饰方法时候的区别
            Animals animalsA = new Human();
            animalsA.Speack();//这里的speak调用的是Human的,而不是Animals的,此时Human实例重载了Animals的Speak方法,父类的Speack已经不存在了。
            animalsA.Run();//这里的run调用的是父类的方法,因为父类的方法没有被覆盖,指针的类型又是父类指针

            Human humanA = (Human)animalsA; //当恢复变量类型一切调用又恢复正常了。
            humanA.Speack();
            humanA.Run ();



        }
    }


    //abstract 和 virtural 区别
    class Animals
    {
        public virtual void Speack(){
            Console.WriteLine ("我是Animals 我说话");
        }

        public void Run(){
            Console.WriteLine ("我是Animals 我在奔跑");
        }

        public virtual void Smile(){
            Console.WriteLine ("我是Animals 我在Smile");
        }
    }

    class Human:Animals
    {
        public override void Speack(){
            Console.WriteLine ("我是Human 我说话");
        }

        public new void Run(){

            Console.WriteLine ("我是Human 我在奔跑");
        }




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值