黑马程序员技术交流社区

标题: 虚方法和抽象方法的区别? [打印本页]

作者: 大牙到潍坊    时间: 2013-12-5 23:17
标题: 虚方法和抽象方法的区别?
本帖最后由 大牙到潍坊 于 2013-12-6 12:29 编辑

虚方法(virtual )和抽象方法(abstract)的区别?
作者: 七里香    时间: 2013-12-5 23:29
区别很大,一个有方法体,一个没有。所以虚方法可以调用,但是抽象方法没办法调用哦。而且因为抽象方法没有方法体,所以有抽象方法的类也必须为abstract修饰的抽象类。而且抽象类不能被实例化。继承抽象类的子类必须实现抽象方法,除非子类也为抽象类。至于相似点嘛,那都是可以在子类中用override重写。
作者: 不明觉厉    时间: 2013-12-5 23:32
  虚方法                                                                 抽象方法
1.virtual修饰                                                           用abstract修饰
2.要有方法体,哪怕是一个分号                                   不允许有方法体可以被子类override   
3.必须被子类override除了密封类外都可以写                只能在抽象类中
作者: 土豆泥    时间: 2013-12-6 10:59
虚方法必须有实现部分,抽象方法没有实现部分
虚方法为派生类提供了覆盖选项,抽象方法是强制派生类覆盖
虚方法没必要重写,抽象方法必须在派生类中重写

抽象方法可以看成是没有实现部分的虚方法。
作者: u010209195    时间: 2013-12-6 12:09
本帖最后由 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();    -----------------------我是老师子类

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

作者: u010209195    时间: 2013-12-6 12:13
本帖最后由 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("我会飞!");
    }
}   




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2