抽象方法和虚拟方法有什么区别?在哪些情况下,建议使用抽象方法或虚拟方法?哪一种是最好的方法?
当前回答
绑定是将名称映射到代码单元的过程。
后期绑定意味着我们使用名称,但延迟映射。换言之,我们首先创建/提及名称,然后让后续流程处理代码到该名称的映射。
现在考虑:
与人类相比,机器确实擅长搜索和排序与机器相比,人类确实擅长发明和创新
因此,简单的答案是:virtual是机器(运行时)的后期绑定指令,而abstract是人类(程序员)的后期约束指令
换句话说,虚拟意味着:
亲爱的运行时,通过执行您最擅长的操作将适当的代码绑定到此名称:搜索
抽象意味着:
亲爱的程序员,请尽你所能将适当的代码绑定到这个名字上:发明
为完整起见,重载意味着:
“亲爱的编译器,通过做你最擅长的事情,将适当的代码绑定到这个名称:排序”。
其他回答
从C++背景来看,C#虚拟对应于C++虚拟,而C#抽象方法对应于C++纯虚拟函数
只有抽象类才能有抽象成员。从抽象类继承的非抽象类必须重写其抽象成员。抽象成员是隐式虚拟的。抽象成员不能提供任何实现(抽象在某些语言中称为纯虚拟)。
图.-命题的传统三重分类。
在道义逻辑(义务和许可的研究)中,每个命题都是强制性的(“必须”运算符)、可选的(“可能”运算符)或不允许的(“不得”运算符),任何命题都不属于这三类中的一类。
此外,允许(“可能”运算符)命题是强制性或可选的命题,不允许(“未必”运算符)的命题是不允许或可选的,非可选(“必须或不得”运算符)是强制性或不允许的命题。
特别是,强制性命题是允许的,而不允许的命题是不允许的。
将这些运算符应用于命题“方法被覆盖”会产生以下命题:
抽象(纯)/具体方法:该方法必须被重写/不能被重写;virtual/real(final)方法:该方法可以被重写/不能被重写。
特别是,抽象方法是虚拟的,而真实方法是具体的。
如果一个类从这个抽象类派生,那么它将被强制重写抽象成员。这与虚修饰符不同,虚修饰符指定可以可选地重写成员。
从面向对象的常规视图:关于抽象方法:当你把一个抽象方法放在父类中时,实际上你在对子类说:嘿,注意你有一个这样的方法签名。如果你想使用它,你应该实现你自己的!关于虚拟函数:当你在父类中放置一个虚拟方法时,你会对派生类说:嘿,这里有一个功能可以为你做些什么。如果这对你有用,就使用它。如果没有,重写它并实现你的代码,甚至你可以在代码中使用我的实现!这是关于通用OO中这两个概念之间不同的一些哲学