抽象方法和虚拟方法有什么区别?在哪些情况下,建议使用抽象方法或虚拟方法?哪一种是最好的方法?
当前回答
绑定是将名称映射到代码单元的过程。
后期绑定意味着我们使用名称,但延迟映射。换言之,我们首先创建/提及名称,然后让后续流程处理代码到该名称的映射。
现在考虑:
与人类相比,机器确实擅长搜索和排序与机器相比,人类确实擅长发明和创新
因此,简单的答案是:virtual是机器(运行时)的后期绑定指令,而abstract是人类(程序员)的后期约束指令
换句话说,虚拟意味着:
亲爱的运行时,通过执行您最擅长的操作将适当的代码绑定到此名称:搜索
抽象意味着:
亲爱的程序员,请尽你所能将适当的代码绑定到这个名字上:发明
为完整起见,重载意味着:
“亲爱的编译器,通过做你最擅长的事情,将适当的代码绑定到这个名称:排序”。
其他回答
当您希望继承者根据需要扩展功能时,基本上可以使用虚拟方法。
当您希望继承者实现功能时,可以使用抽象方法(在这种情况下,他们别无选择)
必须始终重写抽象函数。
因此:
抽象函数-当继承者必须提供自己的实现时虚拟-由继承人决定
从C++背景来看,C#虚拟对应于C++虚拟,而C#抽象方法对应于C++纯虚拟函数
抽象函数不能有主体,必须由子类重写
虚函数将有一个主体,并且可以或不可以被子类重写
抽象函数或方法是由类公开的公共“操作名称”,其目的与抽象类一起,主要是在对象设计中针对对象必须实现的结构提供一种形式的约束。
事实上,从其抽象类继承的类必须为该方法提供一个实现,通常编译器在不实现时会引发错误。
使用抽象类和方法非常重要,主要是为了避免在设计类时关注实现细节,从而导致类结构与实现过于相关,从而在它们之间协作的类之间创建依赖关系和耦合。
虚拟函数或方法只是一种模拟类的公共行为的方法,但我们可以在继承链中自由修改它,因为我们认为子类可能需要为该行为实现一些特定的扩展。
它们都代表了面向对象范式中的一种多元化。
我们可以一起使用抽象方法和虚拟函数来支持一个好的继承模型。
我们为解决方案的主要对象设计了一个很好的抽象结构,然后通过定位那些更易于进一步专门化的对象来创建基本实现,我们将这些对象作为虚拟对象,最后我们专门化我们的基本实现,最终“覆盖”继承的虚拟对象。