抽象方法和虚拟方法有什么区别?在哪些情况下,建议使用抽象方法或虚拟方法?哪一种是最好的方法?


当前回答

抽象方法:当类包含抽象方法时,该类必须声明为抽象的。抽象方法没有实现,因此派生自该抽象类的类必须为该抽象方法提供实现。

虚拟方法:类可以具有虚拟方法。虚拟方法有一个实现。当从具有虚拟方法的类继承时,可以重写虚拟方法并提供额外的逻辑,或者用自己的实现替换逻辑。

何时使用什么:在某些情况下,您知道某些类型应该有一个特定的方法,但您不知道该方法应该有什么实现。在这种情况下,您可以创建包含具有此签名的方法的接口。然而,如果您有这样的情况,但您知道该接口的实现者也将有另一个通用方法(您已经可以为其提供实现),那么您可以创建一个抽象类。然后,这个抽象类包含抽象方法(必须重写)和另一个包含“公共”逻辑的方法。

如果您有一个可以直接使用的类,但您希望继承者能够更改某些行为,则应使用虚拟方法,尽管这不是强制性的。

其他回答

当您希望继承者根据需要扩展功能时,基本上可以使用虚拟方法。

当您希望继承者实现功能时,可以使用抽象方法(在这种情况下,他们别无选择)

必须始终重写抽象函数。

因此:

抽象函数-当继承者必须提供自己的实现时虚拟-由继承人决定

抽象函数不能有主体,必须由子类重写

虚函数将有一个主体,并且可以或不可以被子类重写

我在一些地方看到抽象方法的定义如下**

“必须在子类中实现抽象方法”

**我觉得是这样。

如果子类也是抽象的,则不必在子类中实现抽象方法。。

1) 抽象方法不能是私有方法。2) 抽象方法不能在同一抽象类中实现。

我会说。。如果我们要实现一个抽象类,您必须重写基础抽象类中的抽象方法。因为使用重写关键字实现抽象方法。类似于虚拟方法。

虚拟方法不必在继承类中实现。

                                 ----------CODE--------------

public abstract class BaseClass
{
    public int MyProperty { get; set; }
    protected abstract void MyAbstractMethod();

    public virtual void MyVirtualMethod()
    {
        var x = 3 + 4;
    }

}
public abstract class myClassA : BaseClass
{
    public int MyProperty { get; set; }
    //not necessary to implement an abstract method if the child class is also abstract.

    protected override void MyAbstractMethod()
    {
        throw new NotImplementedException();
    }
}
public class myClassB : BaseClass
{
    public int MyProperty { get; set; }
    //You must have to implement the abstract method since this class is not an abstract class.

    protected override void MyAbstractMethod()
    {
        throw new NotImplementedException();
    }
}

从面向对象的常规视图:关于抽象方法:当你把一个抽象方法放在父类中时,实际上你在对子类说:嘿,注意你有一个这样的方法签名。如果你想使用它,你应该实现你自己的!关于虚拟函数:当你在父类中放置一个虚拟方法时,你会对派生类说:嘿,这里有一个功能可以为你做些什么。如果这对你有用,就使用它。如果没有,重写它并实现你的代码,甚至你可以在代码中使用我的实现!这是关于通用OO中这两个概念之间不同的一些哲学