none
抽象类,抽象方法,虚方法,接口,四者之间的区别及用法,作用 RRS feed

  • 问题

  • 既然类的函数中声明virtual,就可以让子类重写基类的方法,那为什么还要抽象类和接口呢?他们存在的意义?
    2016年1月5日 2:13

答案

  • 基类中不需要实现的,可以使用抽象类。这个和使用Virtual区别不大。区别较大的是接口。

    一个重要原因就是一个类只能从一个类继承,但是可以实现多个接口。

    有些场合是需要先定义好接口,然后调用端和被调用端可以分别实现。基础类库中就有一些用法,例如

    List<T>.Sort Method (IComparer<T>) 定义为: 

    publicvoid Sort( IComparer<T> comparer )

    这样使用者可以实现任何方式的比较器,Sort函数都可以调用它们。

    还有foreach, 只有实现了System.Collections.IEnumerable or System.Collections.Generic.IEnumerable<T>的类才能被foreach遍历。

    这些都是使用接口的典型场景。
    2016年1月5日 5:02
  • 你好 panhuatu,

    使用虚函数有一些限制如下:

    1.虚函数仅适用于有继承关系的类对象, 所以只有类的成员函数才能说明为虚函数.

    2.静态成员函数不能是虚函数.

    3.内联函数不能是虚函数.

    4构造函数不能是虚函数.

    5.析构函数可以是虚函数. 简单点说,抽象方法是需要子类去实现的.虚方法,是已经实现了,子类可以去覆盖,也可以不覆盖取决于需求.

    为什么要抽象类,可以参考下面的连接

    http://www.cnblogs.com/anrainie/archive/2012/03/28/2420738.html

    关于接口的作用可以参考一下链接

    http://www.cnblogs.com/lynnlin/archive/2008/06/25/1229928.html

    Best regards,

    Cole Wu

    2016年1月22日 9:38
    版主

全部回复

  • 基类中不需要实现的,可以使用抽象类。这个和使用Virtual区别不大。区别较大的是接口。

    一个重要原因就是一个类只能从一个类继承,但是可以实现多个接口。

    有些场合是需要先定义好接口,然后调用端和被调用端可以分别实现。基础类库中就有一些用法,例如

    List<T>.Sort Method (IComparer<T>) 定义为: 

    publicvoid Sort( IComparer<T> comparer )

    这样使用者可以实现任何方式的比较器,Sort函数都可以调用它们。

    还有foreach, 只有实现了System.Collections.IEnumerable or System.Collections.Generic.IEnumerable<T>的类才能被foreach遍历。

    这些都是使用接口的典型场景。
    2016年1月5日 5:02
  • 你好 panhuatu,

    使用虚函数有一些限制如下:

    1.虚函数仅适用于有继承关系的类对象, 所以只有类的成员函数才能说明为虚函数.

    2.静态成员函数不能是虚函数.

    3.内联函数不能是虚函数.

    4构造函数不能是虚函数.

    5.析构函数可以是虚函数. 简单点说,抽象方法是需要子类去实现的.虚方法,是已经实现了,子类可以去覆盖,也可以不覆盖取决于需求.

    为什么要抽象类,可以参考下面的连接

    http://www.cnblogs.com/anrainie/archive/2012/03/28/2420738.html

    关于接口的作用可以参考一下链接

    http://www.cnblogs.com/lynnlin/archive/2008/06/25/1229928.html

    Best regards,

    Cole Wu

    2016年1月22日 9:38
    版主