对抽象类和虚方法的总结【转】

抽象类定义:



它的作用就是产生子类的同时给于子类一些特定的属性和方法。
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);
    }
}

虚方法定义:



简单的说,虚方法就是可以被子类重写的方法,如果子类重写了虚方法,那么运行时将使用重写后的逻辑,如果没有重写,则使用父类中虚方法的逻辑;
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方法必须在派生类中重写,而virtual则不必;
~abstract方法不能声明方法实体,虚方法则可以。

转自 Peterluo的技术博客

对抽象类和虚方法的总结【转】

时间: 2024-10-09 21:50:12

对抽象类和虚方法的总结【转】的相关文章

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

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

c#多态之抽象类与虚方法的异同点~

多态之抽象类与虚方法的相似点及不同点 : 不同点 1.方法关键字不一样 虚方法的方法关键字是:virtual. 抽象类的方法关键词是:abstract 2.基类的方法是否有方法体/实现 虚方法的方法:声明并实现方法. 抽象类的方法:只作声明,无方法体/无实现. 共同点 1.子类/派生类都要重写父类的方法:关键字overcode 其他的暂时未想到,笔记先分享到这里!欢迎各位大神评论.纠错.及补充!O(∩_∩)O谢谢.

对抽象类和虚方法的区别

抽象类定义:它的作用就是产生子类的同时给于子类一些特定的属性和方法.abstract修饰符可以和类.方法.属性.索引器及事件一起使用.在类声明中使用abstract修饰符以指示某个类只能是其他类的父类.标记为抽象或包含在抽象类中的成员必须通过从抽象类的子类来实现. 特性:1.抽象类不能被实例化:2.抽象类可以包含抽象方法和抽象访问器:3.不能用sealed修饰符修饰:4.从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现. 总结:~抽象方法是隐式的虚方法:~只容许在抽象类中使用抽

C#面向对象的基本概念 (Basic C# OOP Concept) 第三部分(多态,抽象类,虚方法,密封类,静态类,接口)

9.多态 Ploy的意思就是多于一种形式.在文章开始,方法那一章节就已经接触到了多态.多个方法名称相同,而参数不同,这就是多态的一种. 方法重载和方法覆盖就是用在了多态.多态有2中类型,一种是编译时多态,一种是运行时多态. 方法重载: 方法重载就是,多个方法拥有相同的方法名称,而参数个数或类型不同. 下面就是一个多态的例子,可以看到方法名称“BedRoom”被用到了2个方法中,就是2个方法有共同的方法名称"BedRoom",但是2个方法的参数是不同的. 1 class HouseOwn

抽象类和虚方法、base关键字

微软官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/abstract-and-sealed-classes-and-class-members 抽象类和类成员 通过在类定义前面放置关键字 abstract,可以将类声明为抽象类. 例如: public abstract class A { // Class members here. } 抽象类不能实例化. 抽象类的

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

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

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

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

C#.NET里面抽象类,接口,虚方法

1抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 (4) 具体派生类必须覆盖基类的抽象方法 (5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖.如果不覆盖,则其具体派生类必须覆盖它们.如: using System; public abstract class A //抽象类A { private int num=0; public

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

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