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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大牙到潍坊 中级黑马   /  2013-12-5 23:17  /  1305 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 大牙到潍坊 于 2013-12-6 12:29 编辑

虚方法(virtual )和抽象方法(abstract)的区别?

评分

参与人数 1技术分 +1 收起 理由
陈福军 + 1

查看全部评分

5 个回复

倒序浏览
区别很大,一个有方法体,一个没有。所以虚方法可以调用,但是抽象方法没办法调用哦。而且因为抽象方法没有方法体,所以有抽象方法的类也必须为abstract修饰的抽象类。而且抽象类不能被实例化。继承抽象类的子类必须实现抽象方法,除非子类也为抽象类。至于相似点嘛,那都是可以在子类中用override重写。

评分

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

查看全部评分

回复 使用道具 举报
  虚方法                                                                 抽象方法
1.virtual修饰                                                           用abstract修饰
2.要有方法体,哪怕是一个分号                                   不允许有方法体可以被子类override   
3.必须被子类override除了密封类外都可以写                只能在抽象类中

评分

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

查看全部评分

回复 使用道具 举报
虚方法必须有实现部分,抽象方法没有实现部分
虚方法为派生类提供了覆盖选项,抽象方法是强制派生类覆盖
虚方法没必要重写,抽象方法必须在派生类中重写

抽象方法可以看成是没有实现部分的虚方法。

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 u010209195 于 2013-12-6 12:13 编辑

虚方法: 关键字---virtual ,  可以让派生类重写本类的方法.

这里有个类,就简单手写了:
  1. public class Person
  2. {
  3.     public string _name;
  4.     public int _age;
  5.     public char _gender;

  6.     public virtual void SayHello()
  7.     {
  8.         Console.WriteLine("我是父类");
  9.     }
  10. }

  11. public class Student: Person
  12. {
  13.     public string _id;
  14.    
  15.     public override void Sayhello()
  16.     {
  17.         Console.WriteLine("我是学生子类");
  18.     }
  19. }

  20. public class Teacher: Person
  21. {
  22.     public string _employee;
  23.    
  24.     public override void Sayhello()
  25.     {
  26.         Console.WriteLine("我是老师子类");
  27.     }
  28. }

复制代码

有三个类,学生和老师继承自人类,下面我分别实例一个老师和学生,用父类来接收:
  1. Person p1 = new Student();

  2. Person p2 = new Teacher();
复制代码

现在我调用SayHello这个方法:

p1.SayHello();    ---------------------  我是学生子类

p2.SayHello();    -----------------------我是老师子类

会得到不同的结果,这就是面向对象多态的体现。这是简单的介绍一下噢!

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 u010209195 于 2013-12-6 12:15 编辑

抽象方法跟虚方法类似,但是抽象方法只能存在于抽象类中,且抽象方法没有方法体:

  1. public abstract class Person
  2. {
  3.     public string _name;
  4.    
  5.     public abstract void SayHello();  --------分号别忘了!!!
  6. }  
复制代码

如果一个类继承自抽象类,则必须实现抽象类中的所有抽象方法

再补充一个接口吧,一般情况下是这三个一起比较区别和联系的;

接口  -----Interface由于一个类最多只能继承另一个类,接口可以使一个类有多个基类。接口主要目的是为不相关的类提供通用的处理服务,由于C#中只允许树形结构中的单继承,即一个类只能继承一个父类,所以接口是让一个类具有两个以上基类的唯一方式。如果一个类“继承”了某个接口,则必须实现它!
接口定义名称的时候最好以I开头,这个是规范书写代码的一种习惯。

  1. Interface IFlyable
  2. {
  3.     void Fly();
  4. }
复制代码

一个最简单的接口就好了..,然后就是实现它!
public class Student: Person , IFlyable
{
    ............................
    //最后必须实现这个接口
    public override void Fly()
    {
        Console.WriteLine("我会飞!");
    }
}   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马