抽象方法和虚拟方法有什么区别?在哪些情况下,建议使用抽象方法或虚拟方法?哪一种是最好的方法?
当前回答
上面的大多数示例都使用代码,而且非常好。我不需要补充他们所说的内容,但以下是一个简单的解释,使用了类比而不是代码/技术术语。
简单解释-使用类比进行解释
抽象方法
想想乔治·W·布什。他对士兵们说:“去伊拉克打仗吧”。就这样,他所说的就是必须战斗。他没有具体说明这将如何发生。但我的意思是,你不能只是出去“战斗”:那到底意味着什么?我是用B-52还是我的人字架?这些具体细节留给其他人。这是一种抽象方法。
虚拟方法
大卫·彼得雷乌斯在军队中地位很高。他定义了战斗的含义:
找到敌人中和他。之后喝杯啤酒
问题是这是一种非常通用的方法。这是一个有效的好方法,但有时不够具体。对彼得雷乌斯来说,好事是他的命令有回旋余地和范围——他允许其他人根据他们的特殊要求改变他对“战斗”的定义。
私人职业博客阅读彼得雷乌斯的命令,并根据他的特殊要求获得了实施自己版本的战斗的许可:
找到敌人。朝他的头部开枪。回家吧喝啤酒。
努里·马利基也收到彼得雷乌斯的同样命令。他也要战斗。但他是一名政治家,而不是一名步兵。显然,他不能四处射击他的政治敌人的头部。因为彼得雷乌斯给了他一种虚拟的方法,所以马利基可以根据自己的具体情况,实施自己的战斗方法:
找到敌人。让他以一些捏造的罪名被捕。回家吧喝啤酒。
换言之,虚拟方法提供了样板指令——但这些是一般指令,可以由军队继承人根据他们的具体情况做出更具体的说明。
两者之间的区别
乔治·布什没有证明任何实施细节。这必须由其他人提供。这是一种抽象方法。另一方面,彼得雷乌斯确实提供了实施细节,但他已经允许他的下属,如果他们能想出更好的办法,可以用自己的版本推翻他的命令。
希望这会有所帮助。
其他回答
从C++背景来看,C#虚拟对应于C++虚拟,而C#抽象方法对应于C++纯虚拟函数
必须始终重写抽象函数。
因此:
抽象函数-当继承者必须提供自己的实现时虚拟-由继承人决定
抽象函数不能有主体,必须由子类重写
虚函数将有一个主体,并且可以或不可以被子类重写
虚拟方法:
虚拟意味着我们可以超越它。虚拟函数有一个实现。当我们继承类时可以重写虚拟函数并提供我们自己的逻辑。我们可以在实现子类中的函数(可以说是阴影)。
抽象方法
抽象意味着我们必须重写它。抽象函数没有实现,必须在抽象类中。它只能声明。这迫使派生类提供它的实现。抽象成员是隐式虚拟的。在某些语言中,抽象可以称为纯虚拟。公共抽象类BaseClass{ 受保护的抽象void xAbstractMethod();公共虚拟void xVirtualMethod(){变量x=3+4;}}
抽象函数不能具有功能。你基本上是说,任何子类都必须给出自己版本的这个方法,但是它太通用了,甚至无法在父类中实现。
一个虚拟函数,基本上就是说,看,这里的功能对于子类来说可能不够好,也可能不够好。因此,如果它足够好,请使用此方法,如果不好,请重写我,并提供您自己的功能。