首页 > 其他 > 详细

abstract、virtual、override和new

时间:2014-03-17 04:20:42      阅读:539      评论:0      收藏:0      [点我收藏+]

梳理一下static、abstract、virtual、override和new之间的关系

 

①static类里的所有成员都应该是static的,且不能被继承,static的方法也不能加abstract或virtual;

  但是在非static类里面的static方法可以在子类中被同名非static方法覆盖,

bubuko.com,布布扣
//父类
public class ClassBase
{
    public static string A(){return "ClassBase.StaticA";}//父类静态方法
}

//子类
public class ClassSon :ClassBase
{
    public new string A()//使用new来覆盖,否则编译器提示警告,且该方法不能再申明为static
    {
        return "ClassSon.A";
    }
}
bubuko.com,布布扣

  

②abstract的方法和属性必须包含在abstract的类中,abstract的方法不能有方法体,即不能有任何实现,而是在子类中实现,且子类中实现该方法时必须加override;

bubuko.com,布布扣
//父类
public abstract class ClassBase
{
    public abstract string A();//不能包含实现,且必须是抽象类成员
}

//子类
public class ClassSon:ClassBase
{
    public override string A()//必须加override
    {
        return "Son.A";
    }
}
bubuko.com,布布扣

 

②virtual的方法和属性有方法体,有自己的实现,可以在其子类中使用new或override来重写,其区别如下

bubuko.com,布布扣
//父类
public class ClassBase
{
    public virtual string A()
    {
        return "ClassBase.A";
    }
}

//使用new的子类
public class ClassSon1:ClassBase
{
    public new string A()
    {
        return "ClassSon1.A";
    }
}

//使用override的子类
public class ClassSon2:ClassBase
{
    public override string A()
    {
        return "ClassSon2.A";
    }
}

//client代码
public class Client
{
    pulbic void main()
    {
        ClassBase cb1 = new ClassSon1();
        ClassBase cb2 = new ClassSon2();
        Console.WriteLine(cb1.A());
        Console.WriteLine(cb2.A());
    }
}
bubuko.com,布布扣

运行结果为:

ClassBase.A

ClassSon2.A

 

③另外,没申明为virtual的方法,也可以在子类中使用new类重写,效果跟上面第二点中使用new的效果一样,当然不使用new也可以,不过编译器会给出警告。

abstract、virtual、override和new,布布扣,bubuko.com

abstract、virtual、override和new

原文:http://www.cnblogs.com/ArtofDesign/p/3603318.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!