c#中abstract、override、new、virtual、sealed使用和示例

原创 2012年03月29日 21:17:21

abstract

     修饰类名为抽象类,修饰方法为抽象方法。如果一个类为抽象类,则这个类智能是其他某个类的基类。抽象方法在抽象类中没有函数体。抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽象方法。

     抽象类有如下特征:

  • 抽象类不能实例化
  • 抽象类的派生类必须实现所有抽象方法
  • 抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽象方法

抽象方法:
  • 抽象方法是隐式的虚方法
  • 只允许在抽象类中使用抽象方法声明
  • 抽象方法在抽象类中没有方法体
  • 在抽象方法声明中,不能使用static或者virtual修饰符
abstract class A //abstract 关键字在class前面
{
    public abstract void run();//方法是将关键字abstract 添加到方法的返回类型的前面
}

override
    override关键字提供派生类对基类方法的新的实现,重写的基类方法必须和基类的方法有着相同的签名(函数名、返回值、参数列表相同)。
    override关键字不可以重写基类非virtual修饰的方法和static修饰的静态方法。
    派生类的override方法和基类的virtual方法必须有相同的访问权限。不能用修饰符new、static、virtual或者abstract修饰override方法。
    派生类的override方法重写的基类方法必须是virtual、abstract或者override的。
     
abstract class A
{
public virtual void MethodA()
{
     //do something
}
public abstract void run();
}
     public class B:A
{
public override void MethodA()
{
    //do somthing
}
public virtual void run()
{
    //do something
}
}


new
    c#中,new的关键字主要有三个功能:
  1. 作为运算符用来创建类的一个对象。 Class obj = new Class();
  2. 作为修饰符。
  3. 用于在泛型声明中约束可能用作类型参数的参数类型。(这个不太清楚)
      在这里主要介绍第2个功能,作为修饰符的作用。
      new声明的方法,当使用子类的类型来调用的时候,它会运行子类的函数,而如果类型是基类的话,被隐藏的基类函数会被调用。
       而子类中函数使用override的时候,则当使用子类的类型来调用的是,它会运行子类的函数,类型是基类的时候,仍会调用子类函数。


       如下例:
       
  // Define the base class
    class Car
    {
        public virtual void DescribeCar()
        {
            System.Console.WriteLine("Four wheels and an engine.");
        }
    }
    // Define the derived classes
    class ConvertibleCar : Car
    {
        public new void DescribeCar()
        {
            System.Console.WriteLine("A roof that opens up.");
        }
    }


    class Minivan : Car
    {
        public override void DescribeCar()
        {
            System.Console.WriteLine("Carries seven people.");
        }
    }
    public class Program
    {
        public static void Main()
        {
            Car car1 = new Car();
            car1.DescribeCar();
            System.Console.WriteLine("----------");


            Car car2 = new ConvertibleCar();
            car2.DescribeCar();
            System.Console.WriteLine("----------");


            Car car3 = new Minivan();
            car3.DescribeCar();
            System.Console.WriteLine("----------");
            System.Console.ReadKey();
        }
    }


virtual
      virtual 关键字允许在派生类中重写这些对象。默认情况下,方法是非虚拟的,不可以重写非虚方法,virtual关键字不可以与static、abstract、private、override一起使用。virtual关键字又是和override紧密不可分的,如果要实现virtual方法就必须要使用override或new关键字(上文已经指出new和override产生的机理不同)。
     

sealed
     
        当对一个类应用sealed修饰符时,此修饰符会阻止其他类从该类继承。
    sealed 方法必须与override连用,也就是说实现sealed方法的类的父类必须实现了此方法。
    sealed关键字有两个作用:
    1 密封类不能被继承。
    2 密封方法重写基类中的方法,但其本身不能在任何派生类中进一步重写

   sealed实例:
    
class X

    {
        protected virtual void F() { Console.WriteLine("X.F"); }
        protected virtual void F2() { Console.WriteLine("X.F2"); }
    }
    class Y : X
    {
        sealed protected override void F() { Console.WriteLine("Y.F"); }
        protected override void F2() { Console.WriteLine("X.F3"); }
    }
    class Z : Y
    {
        // Attempting to override F causes compiler error CS0239.
        // protected override void F() { Console.WriteLine("C.F"); }//sealed修饰的方法是不允许继承的

        // Overriding F2 is allowed.
        protected override void F2() { Console.WriteLine("Z.F2"); }
    }


整体的一个简单实例如下:
 
namespace testVirtualF
{
    interface BaseInterface
    {
        void doWork();
    }
    public abstract class Base:BaseInterface
    {
        public virtual void work()
        {
            Console.WriteLine("基类---现在是上班时间");
        }
        public virtual void outWork()
        {
            Console.WriteLine("基类---现在是下班时间");
        }
        
        public abstract void play();//声明抽象方法,只能在抽象方法中
        public abstract void doWork();//实现接口的抽象类,可以将接口方法映射到抽象方法中
    }

    public class Employer:Base
    {
        public  new void work()
        {
            Console.WriteLine("子类(new)---现在是上班时间");
        }
        public override void outWork()
        {
            Console.WriteLine("子类(override)---现在是下班时间");
        }
        public override void play()
        {
            Console.WriteLine("子类(override)---父类抽象方法");
        }
        public override void doWork()
        {
            Console.WriteLine("父类抽象方法--doWork");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            /*Employer emp = new Employer();
            emp.work();
            emp.outWork();
            emp.play();*/
            /*输出结果
             * 子类(new)---现在是上班时间
             * 子类(override)---现在是下班时间
             */

            /*Employer emp = new Employer();
            Base b = (Base)emp;
            //b.ID = "123";
            b.work();
            b.outWork();
            b.play();*/
            /*执行结果
             * 基类---现在是上班时间
             * 子类(new)---现在是上班时间
             * 子类(override)---现在是下班时间
             */

            Base b = new Employer();
            b.work();
            b.outWork();
            b.play();
            /*执行结果
             * 基类---现在是上班时间
             * 子类(new)---现在是上班时间
             * 子类(override)---现在是下班时间
             */
        }
    }
}


让我们一起写出更有效的CSharp代码吧,少年们!

周末空闲,选读了一下一本很不错的C#语言使用的书,特此记载下便于对项目代码进行重构和优化时查看。 Standing On Shoulders of Giants,附上思维导图,其中标记的颜色越深表示...
  • OuErHuiLaiKanKan
  • OuErHuiLaiKanKan
  • 2016年01月25日 12:32
  • 868

C#中sealed关键字

1. sealed关键字     当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承。类似于Java中final关键字。     在下面的示例中,类 B 从类 A 继承,但是任...
  • huang_xw
  • huang_xw
  • 2013年02月13日 15:58
  • 16960

c# sealed修饰符

sealed的中文意思是密封,故名思义,就是由它修饰的类或方法将不能被继承或是重写。 sealed关键字: 在类声明中使用sealed可防止其它类继承此类;在方法声明中使用sealed修饰符可防止...
  • GAMEloft9
  • GAMEloft9
  • 2015年06月13日 17:15
  • 1027

C#在方法或属性中使用sealed时的操作与原理

在《C#高级编程》第100页中间部分提到”要在方法或属性上使用sealed关键字,必需先从基类上把它声明为要重写的方法或属性。如果基类上不希望有重写的方法或属性,就不要把它声明为virtual。“ ...
  • wdcdavyc
  • wdcdavyc
  • 2014年12月03日 19:26
  • 604

protected、public和private,abstract、virtual和override

通过一个程序介绍protected、public和private,abstract、virtual和override使用时容易出现的错误及其原因。...
  • lxtylovewd
  • lxtylovewd
  • 2015年03月27日 13:18
  • 1038

C#-sealed 封装类的使用

示例1 : using System; using System.Collections.Generic; using System.Linq; using System.Text; namesp...
  • makenothing
  • makenothing
  • 2014年04月10日 21:22
  • 1371

C#中的密封类(sealed)

很多初学者都不明白,C#中为什么会有密封类?        其实我们知道C#语言是一种面向对象的语言,而继承是面向对象的主要特征之一,继承就是在类之间建立一种相交关系,使子类可以继承父类的一些特性,...
  • shadowyelling
  • shadowyelling
  • 2012年06月08日 14:40
  • 2768

c#学习笔记之Application.DoEvents应用

Visual Studio里的摘要:处理当前在消息队列中的所有 Windows 消息。 交出CPU控制权,让系统可以处理队列中的所有Windows消息  比如在大运算量循环内,加Applica...
  • sinat_23338865
  • sinat_23338865
  • 2016年09月20日 15:53
  • 3517

C#中的virtual和abstract

virtual是实现C++多态的关键性条件:C++使用关键字virtual来修饰类中的方法,被修饰的方法可以在子类中重写,如此便覆盖基类方法,以实现相同的行为却不同的功能;多继承情况下的基类析构函数通...
  • iFuMI
  • iFuMI
  • 2016年07月16日 14:43
  • 786

abstract 能和override 一起使用[C#]

在网上查此两关键字是否能一起使用时,查到好多资料都说不能一起使用我在此为其正名,他们俩是可以一起使用的。看代码: using System;class A{ public virtual voi...
  • Sugar_Tiger
  • Sugar_Tiger
  • 2009年05月27日 11:18
  • 950
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c#中abstract、override、new、virtual、sealed使用和示例
举报原因:
原因补充:

(最多只允许输入30个字)