虚方法、抽象类

虚方法:

1、virtual方法表示此方法可以被重写, 也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑. 
2、virtual方法可以直接使用,和普通方法一样 
3、不是必须重写的. 子类可以使用base.方法 的方式调用, 无论有没有在子类使用override去重写

virtual关键字只是明确标示此方法可以被重写, 其实它和一般的方法没有什么区别 
相应的 
sealed关键字标示此方法不可以被重写

虚方法和抽象方法的区别:

1.虚方法可以有实现体,抽象方法不能有实现体。

2.抽象方法
    要求派生类必须重载这个方法;

虚方法
    告诉编译器,这个方法可以重写。
    当基类的方法与派生类的方法重名时,
    可以选择派生类的方法从基类继承并重写,
    还是,把基类的方法隐藏起来。

本段来自CSDN博客:http://blog.csdn.net/lzp_lrp/article/details/8972509

当类中的方法声明前加上了virtual修饰符,我们称之为C#虚拟方法 ,反之为非虚。使用了virtual修饰符后,不允许再有static、abstract或override修饰符。对于非虚的方法,无论被其所在类的实例调用,还是被这个类的派生类的实例调用,方法的执行方式不变。而对于虚方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的。

下面的例子说明了C#虚拟方法与非虚方法的区别。

例子:

  1. using System;
  2. class A
  3. {
  4. public void F(){Console.WriteLine("A.F");}
  5. public virtual void G(){Console.WriteLine("A.G");}
  6. }
  7. class B:A
  8. {
  9. new public void F(){Console.WriteLine("B.F");}
  10. public override void G(){Console.WriteLine("B.G");}
  11. }
  12. class Test
  13. {
  14. static void Main()
  15. {
  16. B b=new B();
  17. A a=b;
  18. a.F();
  19. b.F();
  20. a.G();
  21. b.G();
  22. }
  23. }

例子中,A类提供了两个方法:非虚的F和C#虚拟方法 G.类B则提供了一个新的非虚的方法F,从而覆盖了继承的F;类B同时还重载了继承的方法G.那么输出应该是:

A.F

B.F

B.G

B.G

注意到本例中,方法a.G()实际调用了B.G,而不是A.G.这是因为编译时值为A,但运行时值为B,所以B完成了对方法的实际调用。

虚方法定义:
简单的说,虚方法就是可以被子类重写的方法,如果子类重写了虚方法,那么运行时将使用重写后的逻辑,如果没有重写,则使用父类中虚方法的逻辑;
virtual关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。


using   System   ;  
   
  class   A  
   
  {  
   
  public   void   F(   )  
  {   
      Console.WriteLine("A.F")   ;  
  }
   
  public   virtual   void   G(   )  
  {  
      Console.WriteLine("A.G")   ;   
  }
   
  }  
   
  class   B:   A  
   
  {  
   
  new   public   void   F(   )  
  {   
      Console.WriteLine("B.F")   ;  
  }
   
  public   override   void   G(   )  
  {   
      Console.WriteLine("B.G")   ; 
  }
   
  }  
   
  class   Test  
   
  {  
   
  static   void   Main(   )    
   
  {  
  B   b   =   new   B(   )   ;  
   
  A   a   =   b;  
   
  a.F(   )   ;  
   
  b.F(   )   ;  
   
  a.G(   )   ;  
   
  b.G(   )   ;  
   
  }  
   
  }   输出是:A.F   B.F  B.G  B.G

抽象类定义:
它的作用就是产生子类的同时给于子类一些特定的属性和方法。
abstract修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用abstract修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

特性:
1.抽象类不能被实例化;
2.抽象类可以包含抽象方法和抽象访问器;
3.不能用sealed修饰符修改抽象类,这意味着抽象类不能被继承;
4.从抽象类派生的飞抽象类必须包括继承的所有抽象方法和抽象访问器的实现。

总结:
~抽象方法是隐式的虚方法;
~只容许在抽象类中使用抽象方法声明;
~因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号“{}”,实现由一个重方法提供,此重方法是非抽象类的成员;
~在抽象方法声明中使用static或virtual修饰符是错误的;
~除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样;
~在静态属性上使用absteact修饰符是错误的;

~在派生类中,通过包括使用override修饰符的属性声明,可以重写抽象的继承属性。


using System;
abstract class A
{
    public abstract void F();
    protected int _x;
    public abstract int X
    {
        get;
        set;
    }
}
class B:A
{
    public override void F()
    {
        
    }
    public override int X
    {
        get{return _x;}
        set{_x=value;}
    }
}
class Test
{
    static void Main()
    {
        B b=new B();
        b.X=10;
        Console.Write(b.X);
    }
}

抽象方法和虚方法的区别 :

~抽象方法和虚方法的区别在于:虚拟方法有一个实现部分,并为派生类提供了覆盖该方法的选项,相反,抽象方法没有提供实现部分,强制派生类覆盖方法(否则 派生类不能成为具体类);
~abstract方法只能在抽象类中声明,虚方法则不是;
~abstract方法必须在派生类中重写,而virtual则不必;
~abstract方法不能声明方法实体,虚方法则可以。

时间: 2024-08-11 01:35:53

虚方法、抽象类的相关文章

c# 多态实现_虚方法

实现方法: 虚方法, 抽象类, 接口 1.虚方法 将父类的方法标记为虚方法,使用关键字virtual,这个方法可以被子类重新写一遍. 在父类的方法前面加上一个virtual,在子类的方法前面加上一个override:如果子类的方法前面不加override,编译器不会报错,但这样的话,就无法通过父类来调用子类的方法,因为这个方法成了子类的独有的方法,只是名字与父类相同而已,与父类无关. 注意:如果需要对父类的方法进行重写的话,一定要在子类的方法面前加上overrie进行修饰. 什么时候使用:几个类

面向对象:继承、抽象类、抽象方法、虚方法

1.继承什么是继承?目的:代码重用public class 子类:父类{ }父类 基类 被继承的类子类 派生类 需要继承的类 父类构造函数的继承创建子类对象时,先调用父类构造函数,再调用子类构造函数默认调用父类无参构造函数如果子类有无参构造函数,要求父类也有无参构造函数如果调用父类的有参构造函数,显式用base调用 public 子类(参数列表)base(实参)实参:要调用的父类的有参构造函数的参数列表{} base:父类对象(父类实例) 2.抽象abstract 抽象方法:访问修饰符 abst

第二章 C#继承&继承类型&虚函数&抽象类&抽象函数&抽象方法&隐藏方法

继承:实现继承,接口继承. C#不支持多实现继承,支持多接口继承 public class Class4:Class3,IInterface1,IInterface2 { } 虚方法:virtual 基类中声明virtual方法,在派生类中可以重写,并且调用的时候总是调用重写的方法. public class Class1 { public virtual void A() { Console.WriteLine("Class1.A"); } public void B() { Con

接口 抽象类 虚方法 三者比较-1

接口 1.接口只提供方法规约,不提供方法体: 2.接口中的方法不能用关键字修饰: 3.接口里不能有接口和变量: 4.接口里的方法在子类中必须全部实现: 5.接口可以实现多重继承: 抽象类 1.抽象类可以从接口继承: 2.抽象类中的实体方法在子类中不可以重写,只可以被引用: 3.抽象类中的抽象方法不可以有方法体,抽象类中的抽象方法在子类中必须重写: 4.抽象类中的虚方法在子类中可以选择性的重写: 虚方法 1.可以在子类选择性的重写: 2.不重写也可被子类调用: 接口与抽象类的异同 1.抽象类的抽象

大龙的学习笔记之“虚方法,抽象方法,重写,抽象类,接口”

虚方法:可以重写,也可以不重写,英文名:virtual 抽象方法:必须重写,必须放在抽象类中,英文名:abstract 重写:可以重写三种方法:virtual,abstract,override,英文名:override 抽象类:可以有抽象方法,也可以有非抽象方法,英文名:abstract 接口:和抽象类相似,但是里面只有未实现的方法,英文名:interface 大龙的学习笔记之"虚方法,抽象方法,重写,抽象类,接口",布布扣,bubuko.com

多态—虚方法、抽象类、接口

修饰符:public : 公共的,引用命名空间即可随意访问,访问权限最高:private : 私有的,只有在声明它的类和结构中才可以访问,访问权限最低: Internal : 内部的,同一个程序集中所有的类都可以访问,程序集就是命名空间, 访问权限次最高,这个访问修饰符是默认的:Protected : 受保护的,只能在他自己和自己的子类中才能访问. --------------------------------------------------------------------------

浅谈接口、抽象类、抽象方法和虚方法的区别

C#抽象类和接口孩子间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于抽象类和接口的选择显得比较随意.其实,两者之间还是有很大区别的. 首先说一下接口与抽象类的异同: 相同点: 1.他们都不能实例化自己,也就是说都是用来被继承的. 2.抽象类中的抽象方法和接口方法一样,都不能有方法体 不同点: 1.抽象类里可以有字段,接口中不能有字段. 2.抽象类中的普通方法可以有方法体,而接口方法没有方法体. 3.接口中的方法不能有访问修饰符,抽象类中的抽象方

C#中的抽象类、抽象方法和虚方法

[抽象类]abstract 修饰符可与类和方法一起使用定义抽象类的目的是提供可由其子类共享的一般形式.子类可以根据自身需要扩展抽象类.抽象类不能实例化.抽象方法没有函数体.抽象方法必须在子类中给出具体实现.在以下情况下,某个类将成为抽象类:★ 当一个类的一个或多个方法为抽象方法时.★ 当该类为一个抽象类的子类,并且没有为所有抽象方法提供实现细节或方法主体时.★ 当一个类实现一个接口,并且没有为所有抽象方法提供实现细节或方法主体时. abstract class Employee {    pub

多态,虚方法重写,抽象类,接口

简而言之就是龙生九子,各有不同 有了继承,才有了多态 1.虚方法 virtual重写 override 父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了virtual关键字的方法才可以被子类重写 子类重写父类的方法使用的是override关键字 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 多态 { public

抽象类、虚方法、接口的区别

接口 1.接口只提供方法规约,不提供方法体: 2.接口中的方法不能用关键字修饰: 3.接口里不能有接口和变量: 4.接口里的方法在子类中必须全部实现: 5.接口可以实现多重继承: 抽象类 1.抽象类可以从接口继承: 2.抽象类中的实体方法在子类中不可以重写,只可以被引用: 3.抽象类中的抽象方法不可以有方法体,抽象类中的抽象方法在子类中必须重写: 4.抽象类中的虚方法在子类中可以选择性的重写: 虚方法 1.可以在子类选择性的重写: 2.不重写也可被子类调用: 接口与抽象类的异同 1.抽象类的抽象