A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 闫常国 中级黑马   /  2013-5-2 22:57  /  1449 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 闫常国 于 2013-5-3 07:54 编辑

public abstruct class A
{
  public A()
  {
     Console.WriteLine("A");
  }
  public virtual void Fun()
  {
     Console.WriteLine("A.Fun()");
  }
}
public class B:A
{
  public B()
   {
        Console.WriteLine("B");
   }
  public override void Fun()
   {
        Console.WriteLine("A.Fun()");
    }
   public static void Main()
   {
     A a=new B();
    a.Fun();
   }
}
抽象方法和虚方法到底有什么区别?

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 张伟86 于 2013-5-3 01:08 编辑

可以这样理解,抽象方法只是我们为了方便我们在定义事物不去具体的说明这个事物的具体属性而定义的一种方式。例如,富士康里面生产笔记本,这个我们就可以做一个抽象方法,叫做富士康笔记本,这个方法什么都不做,只告诉我们富士康笔记本有笔记本,更为关键的是我们根本就不去使用它,我们也用不到它,这时候就可以将它声明为抽象基类。而至于虚函数,举个例子:A派生B,B派生C,A/B/C中都有个成员函数Print();我们new了一个C类对象,调用Print()函数,根据继承原则,那么我们到底是使用了A的Print还是B的Print还是C的Print呢?当然,你可以直接调用A::Print或者B:: Print或者C:: Print,但是比较麻烦,而虚函数就解决了这个问题,你将Print直接定义为虚函数,那么当你直接Print的时候,它直接就调用的是C:: Print();虚函数帮我们在运行时自动判断使用哪个函数,减少了我们的代码出错几率,也节约了我们的脑细胞(逻辑复杂性,不要我们自己去判断调用了)。
1、首先,抽象类不能被实例化,只能作为子类的基类被继承。即如果A是个abstract类,那么就不能这样调用:A a = new A();抽象类一般是作为子类的公共属性的描述使用的。
2、抽象类中的成员也可为抽象成员,也可以不是抽象成员;如果是抽象成员的话,类似( public abstract  void Fun();  ),不能加函数框体;而你的类中定义的成员不是抽象成员。所以即使在继承类中不重写都是可以的。例如:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace ConsoleApplication1
  6. {
  7.     class Program
  8.     {
  9.         public abstract class A
  10.         {
  11.           public A()
  12.           {
  13.              Console.WriteLine("A");
  14.           }
  15.           public virtual void Fun()
  16.           {
  17.              Console.WriteLine("A.Fun()");
  18.           }
  19.         }

  20.         public class B:A
  21.         {
  22.           public B()
  23.            {
  24.                 Console.WriteLine("B");
  25.            }
  26.             //注释掉
  27. //           public override void Fun()
  28. //            {
  29. //                 Console.WriteLine("B.Fun()");
  30. //            }           
  31.         }

  32.         static void Main(string[] args)
  33.         {
  34.             
  35.             A a= new B();
  36.             a.Fun();
  37.             Console.ReadKey();
  38.         }
  39.     }
  40. }
复制代码
结果为:

3、你的程序的运行结果是:

这是由于:
a) 类在创建时,进行了初始化,初始化时先调用父类构造函数,再调用子类构造函数,所以输出A,然后B;
b) 虚函数使用运行时绑定技术,当子类中override了基类中的相关函数时,系统自动判断使用哪个函数,这里使用了子类中的函数,所以输出B.Fun();

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

回复 使用道具 举报
张伟86 发表于 2013-5-3 00:48
可以这样理解,抽象方法只是我们为了方便我们在定义事物不去具体的说明这个事物的具体属性而定义的一种方式 ...

太好了 谢谢
回复 使用道具 举报
张伟86 发表于 2013-5-3 00:48
可以这样理解,抽象方法只是我们为了方便我们在定义事物不去具体的说明这个事物的具体属性而定义的一种方式 ...

太好了 谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马