C#--virtual,abstract,override,new,sealed

virtual:使用此关键字,可以使其在派生类中被重写.

abstract:抽象方法,由子类重写,或继续为抽象方法存在,并由其子子类实现.

override: 重写父类方法,属性,或事件的抽象实现或虚方法.

new:显式隐藏从父类继承的成员.

后台代码:

public abstract class Animal
{
    public abstract void Eat();

    public virtual void Sleep()
    {
        HttpContext.Current.Response.Write("动物正在睡觉!<hr/>");
    }
}

public class Horse : Animal
{
    public override void Eat()
    {
        HttpContext.Current.Response.Write("马在吃草!<br/>");
    }

    public override void Sleep()
    {
        HttpContext.Current.Response.Write("马是站着睡觉!<hr/>");
    }
}

public class Cat : Animal
{
    public override void Eat()
    {
        HttpContext.Current.Response.Write("猫在吃食!<br/>");
    }

    public new void Sleep()
    {
        HttpContext.Current.Response.Write("猫是趴着睡觉的!<hr/>");
    }
}
前台调用 效果
    protected void Page_Load(object sender, EventArgs e)
    {
        Animal an1 = new Horse();
        an1.Eat();
        an1.Sleep();

        Animal an2 = new Cat();
        an2.Eat();
        an2.Sleep();

        Horse an3 = new Horse();
        an3.Eat();
        an3.Sleep();

        Cat an4 = new Cat();
        an4.Eat();
        an4.Sleep();
    }

补充:

当sealed修饰方法时,sealed必须与override一起使用.

sealed将使您能够允许类从您的类继承,并防止它们重写特定的虚方法或虚属性

public class Cat : Animal
{
    public sealed override void Eat()
    {
        HttpContext.Current.Response.Write("猫在吃食!<br/>");
    }

    public new void Sleep()
    {
        HttpContext.Current.Response.Write("猫是趴着睡觉的!<hr/>");
    }
}

public class LitCat : Cat
{
    public new void Sleep()
    {
        HttpContext.Current.Response.Write("猫是趴着睡觉的!<hr/>");
    }
}

此时,在LitCat类中,就不会出现override Eat方法了.

时间: 2024-12-14 17:06:33

C#--virtual,abstract,override,new,sealed的相关文章

virtual abstract override

virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的.毕竟加上virtual或abstract就是让子类重新定义的,而private成员是不能被子类访问的. 但是它们的区别很大.(virtual是“虚拟的”,abstract是“抽象的"). (1)virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而abstract修饰的方法一定不

C#Virtual和Override的几种组合

情况1: class A{public void Show()} class B:A{public void Show()} 编译通过,有警告让在B的方法里添加new关键字,以便将A的方法隐藏 编译时绑定(根据声明类型调用方法) 情况2: class A{public virtual void Show()} class B:A{public void Show()} 编译通过,有警告让在B的方法里添加new或者override关键字,默认将A的方法隐藏 编译时绑定(根据声明类型调用方法) 情况

快学Scala 第十九课 (trait的abstract override使用)

trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super.log依旧是个abstract class,所以必须在方法前加上abstract和override.但是并没有具体介绍如何使用,然后查阅了其他文档,才明白使用方法. 下面的代码定义了超类LoggerEmpty,这个定义意味着该特质只能混入扩展LoggerEmpty的类中. 在特质中声明抽象方法中有

C#中的Virtual、Override和new关键词理解

来源:http://blog.csdn.net/jackiezhw/article/details/2673992 在 C# 中,派生类可以包含与基类方法同名的方法. 基类方法必须定义为 virtual. 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作. 如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法. 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方

C#继承中abstract、virtual、override和new

abstract 详细参考:https://msdn.microsoft.com/zh-cn/library/sf985hc5.aspx abstract 修饰符指示所修饰的内容缺少实现或未完全实现. abstract 修饰符可用于类.方法.属性.索引器和事件. 在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类. 标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现. 抽象类具有以下特性: - 抽象类不能实例化. - 抽象类可以包含抽象方法和抽象访问器. - 不能

c#中virtual, abstract和override的区别和用法

virtual是把一个方法声明为虚方法,使派生类可重写此方法,一般建立的方法是不能够重写的,譬如类A中有个方法protected void method(){ 原代码....;}类B继承自类A,类B能够调用类A的method()方法,但不能更改方法体代码,但当类A中使用了virtual声明此方法: protected virtual void method(),那么类B可通过使用override重写此方法protected override void method(){ 新代码....;}vir

C# -abstract, override, virtual, new

new声明的方法,当使用子类的类型来调用的时候,它会运行子类的函数,而如果类型是基类的话,被隐藏的基类函数会被调用. 而子类中函数使用override的时候,则当使用子类的类型来调用的是,它会运行子类的函数,类型是基类的时候,仍会调用子类函数.

virtual与override的使用

在函数的声明中,当有“virtual”修饰的时候,和没有virtual有什么区别呢?最重要的一点就是调用实例的函数是在编译的时候确定还是在运行的时候确定,virtual函数是在运行的时候来确定具体调用哪个类.这个特性是和父子类继承息息相关的. 这儿有个例子,在网上很多地方被转载,我稍微扩展了一下: C#代码   using System; namespace Smz.Test { class A { public virtual void Func() // 注意virtual,表明这是一个虚拟

c# 多态中 Virtual与override的作用

class A { public A() { PrintFields(); } public void PrintFields() { Console.WriteLine("123"); } } class B : A { int x = 1; int y; public B() { y = -1; } public new void PrintFields() { Console.WriteLine("x={0},y={1} ", x, y); } } publi