none
虚方法、抽象类、接口的选择 RRS feed

  • 问题

  • 虚方法:基类中的虚方法,在派生类中重写,也可以不用

    抽象类:基类中的抽象方法在派生类中必须重写,基类中也可以有虚方法

    接口:基类中的抽象方法在派生类中必须重写

    这三者用的时候怎么选择?

    虚方法是为了代码的重复使用,抽象类是对子类限制规则,接口则是区别能力

    但 虚方法+接口 可以实现抽象类的功能,而如果不需要实例化基类,抽象类又可以替代虚方法实现多态

    这三种在开发应用时,应该怎么选择呢?

    2015年5月31日 3:47

答案

  • 很好选择啊。

    接口:这个是.Net特有的,在C++里没有这东西。主要用途就是解决多重继承问题。因为.Net不允许多重继承,所以提供了一个叫做“接口”的东西来实现类似功能。为什么要这么做呢?因为多重继承有很多很麻烦的问题,尤其是基类中有成员变量时,如果你熟悉C++的话,对此应该有深刻理解了,而.Net因为要使用垃圾回收器,所以多重继承就会变得很棘手,微软的解决方案就是改用接口这样一个不允许有任何成员变量的特殊类来规避此类麻烦。

    抽象类和虚函数:如果基类中有某个函数不是通用的,需要子类去实现,而且要求子类必须实现,此时就会用到抽象类,否则就直接用虚函数。一般来说虚函数就可以了,但有时候基类中的虚函数确实没办法在基类中实现,这时就只能用抽象类了。你用不着去刻意选择,平时用虚函数就行了,遇到基类无法事先实现虚函数时,你自然而然的就会使用也只能使用纯虚函数,一个基类一旦具有了纯虚函数,也就自然而然的变成抽象类了。


    Shi Xin

    Picture是一款免费图片浏览器,完全支持触摸操作,赶快来下载吧。

    基类无法事先实现虚方法,这个方法直接用接口,不也可以么?
    2015年5月31日 8:33
  • 从大类上看:

    1)接口是一个“契约”,实现接口的类必须实现这个方法。但是一个类又可以实现不同的多个接口。换句话说——接口之间并不需要存在必然的联系,它们是松散的关系。也就是说,接口是为了整个系统实现某种设计模式复用代码(面向接口)的思维来使用的。

    2)抽象类一般是一个基础实现,是为了生成多个(一批)具备相同特征,但是略有不同方法的模板。比如说“人”的种类有很多,所以“人”是一个抽象类,但是不同人有不同的行为,所以“行为”可以抽象(抽象类)。但是“男人”不会生育,“女人”可以生育。又考虑到不同女人生育方式不同,所以“生育”只能定义为接口,通过抽象类“女子”实现。

    3)虚方法是可以理解是默认的实现(大部分情况下如此)。为了考虑程序的代码复用性和延展性,凡是标记了虚方法的允许继承该类的程序猿使用base.XXX调用默认实现的逻辑,同时拼接自己的逻辑代码(组合)。


    ASP.NET Forum
    Other Discussion Forums
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    相同特征用虚方法,生育定义为接口

    虚方法+接口 不是也可以实现生育吗?

    感觉跟抽象类没什么区别啊


    2015年5月31日 8:37

全部回复

  • 从大类上看:

    1)接口是一个“契约”,实现接口的类必须实现这个方法。但是一个类又可以实现不同的多个接口。换句话说——接口之间并不需要存在必然的联系,它们是松散的关系。也就是说,接口是为了整个系统实现某种设计模式复用代码(面向接口)的思维来使用的。

    2)抽象类一般是一个基础实现,是为了生成多个(一批)具备相同特征,但是略有不同方法的模板。比如说“人”的种类有很多,所以“人”是一个抽象类,但是不同人有不同的行为,所以“行为”可以抽象(抽象类)。但是“男人”不会生育,“女人”可以生育。又考虑到不同女人生育方式不同,所以“生育”只能定义为接口,通过抽象类“女子”实现。

    3)虚方法是可以理解是默认的实现(大部分情况下如此)。为了考虑程序的代码复用性和延展性,凡是标记了虚方法的允许继承该类的程序猿使用base.XXX调用默认实现的逻辑,同时拼接自己的逻辑代码(组合)。


    ASP.NET Forum
    Other Discussion Forums
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2015年5月31日 7:31
    版主
  • 很好选择啊。

    接口:这个是.Net特有的,在C++里没有这东西。主要用途就是解决多重继承问题。因为.Net不允许多重继承,所以提供了一个叫做“接口”的东西来实现类似功能。为什么要这么做呢?因为多重继承有很多很麻烦的问题,尤其是基类中有成员变量时,如果你熟悉C++的话,对此应该有深刻理解了,而.Net因为要使用垃圾回收器,所以多重继承就会变得很棘手,微软的解决方案就是改用接口这样一个不允许有任何成员变量的特殊类来规避此类麻烦。

    抽象类和虚函数:如果基类中有某个函数不是通用的,需要子类去实现,而且要求子类必须实现,此时就会用到抽象类,否则就直接用虚函数。一般来说虚函数就可以了,但有时候基类中的虚函数确实没办法在基类中实现,这时就只能用抽象类了。你用不着去刻意选择,平时用虚函数就行了,遇到基类无法事先实现虚函数时,你自然而然的就会使用也只能使用纯虚函数,一个基类一旦具有了纯虚函数,也就自然而然的变成抽象类了。


    Shi Xin

    Picture是一款免费图片浏览器,完全支持触摸操作,赶快来下载吧。

    基类无法事先实现虚方法,这个方法直接用接口,不也可以么?
    2015年5月31日 8:33
  • 从大类上看:

    1)接口是一个“契约”,实现接口的类必须实现这个方法。但是一个类又可以实现不同的多个接口。换句话说——接口之间并不需要存在必然的联系,它们是松散的关系。也就是说,接口是为了整个系统实现某种设计模式复用代码(面向接口)的思维来使用的。

    2)抽象类一般是一个基础实现,是为了生成多个(一批)具备相同特征,但是略有不同方法的模板。比如说“人”的种类有很多,所以“人”是一个抽象类,但是不同人有不同的行为,所以“行为”可以抽象(抽象类)。但是“男人”不会生育,“女人”可以生育。又考虑到不同女人生育方式不同,所以“生育”只能定义为接口,通过抽象类“女子”实现。

    3)虚方法是可以理解是默认的实现(大部分情况下如此)。为了考虑程序的代码复用性和延展性,凡是标记了虚方法的允许继承该类的程序猿使用base.XXX调用默认实现的逻辑,同时拼接自己的逻辑代码(组合)。


    ASP.NET Forum
    Other Discussion Forums
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    相同特征用虚方法,生育定义为接口

    虚方法+接口 不是也可以实现生育吗?

    感觉跟抽象类没什么区别啊


    2015年5月31日 8:37
  • 这样说吧:

    因为“生育”不是每个人都有的能力,因此不能定义在抽象类中,因为定义为抽象方法的话,凡是“男子”和“女子”都继承该类,都有这个方法,显然不合适的。


    ASP.NET Forum
    Other Discussion Forums
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2015年5月31日 9:25
    版主
  • ?????

    2015年5月31日 10:22
  • 纯虚是C++里面的概念吧,C#里面是用接口来表示必须要实现。这么讲太容易混淆了,毕竟这里是C#论坛


    Barry
    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年6月1日 9:16
    版主
  • @Shi Xin,

    做的太多,没注意看,我下次注意。。。NET有C++/CLI的东西,但不能说包括吧,毕竟一个托管一个非托管,没事我只是很好奇C#的纯虚函数的概念查了一下发现的这个结果,所以分享一下。

    @Nicholas Xu

    按我的理解来看你提到的这些你都可以理解为一些为了达成你目标产生的工具,不是说非要选哪个,我建议就是你参考楼上的一些回复然后根据自己的情况来选择性的设计。



    Barry
    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年6月2日 1:35
    版主