C#中的abstract、virtual、override和new

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

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

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

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

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

  

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

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

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

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

//父类
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
{
    static void Main(string[] args)
    {
        ClassBase cb1 = new ClassSon1();
        ClassBase cb2 = new ClassSon2();
        Console.WriteLine(cb1.A());
        Console.WriteLine(cb2.A());
    }
}

运行结果为:

ClassBase.A

ClassSon2.A

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

原文地址:https://www.cnblogs.com/ArtofDesign/p/3603318.html