Подтвердить что ты не робот

Разница между виртуальными и абстрактными методами

Вот код из MSDN:

// compile with: /target:library 
public class D
{
    public virtual void DoWork(int i)
    {
        // Original implementation.
    }
}

public abstract class E : D
{
    public abstract override void DoWork(int i);
}

public class F : E
{
    public override void DoWork(int i)
    {
        // New implementation.
    }
}

Может ли кто-нибудь объяснить приведенный выше код в отношении различий между абстрактными и виртуальными методами?

4b9b3361

Ответ 1

Виртуальные методы имеют реализацию и предоставляют производным классам возможность их переопределения. Абстрактные методы не обеспечивают реализацию и заставляют производные классы переопределять метод.

Итак, абстрактные методы не имеют в них реального кода, а подклассы HAVE TO переопределяют метод. Виртуальные методы могут иметь код, который обычно представляет собой реализацию по умолчанию, и любые подклассы МОЖЕТ переопределить метод с помощью модификатора override и предоставить пользовательскую реализацию.

public abstract class E
{
    public abstract void AbstractMethod(int i);

    public virtual void VirtualMethod(int i)
    {
        // Default implementation which can be overridden by subclasses.
    }
}

public class D : E
{
    public override void AbstractMethod(int i)
    {
        // You HAVE to override this method
    }
    public override void VirtualMethod(int i)
    {
        // You are allowed to override this method.
    }
}

Ответ 2

Прежде всего, вы должны знать разницу между виртуальным и абстрактным методом.

Абстрактный метод

  • Абстрактный метод находится в абстрактном классе и не имеет тела.
  • Абстрактный метод должен быть переопределен в не абстрактном дочернем классе.

Виртуальный метод

  • Виртуальный метод может находиться в абстрактном и не абстрактном классе.
  • Нет необходимости переопределять виртуальный метод в производном, но это может быть.
  • Виртуальный метод должен иметь тело.... может быть переопределено ключевым словом переопределения.....

Ответ 3

абстрактный метод должен быть переопределен вызовом в производном классе, иначе он даст ошибку времени компиляции и в виртуальном вы можете или не можете переопределить его, если он достаточно хорош, используйте его

Пример:

abstract class twodshape
{
    public abstract void area(); // no body in base class
}

class twodshape2 : twodshape
{
    public virtual double area()
    {
        Console.WriteLine("AREA() may be or may not be override");
    }
}

Ответ 4

Абстрактный метод:

  • Если абстрактный метод определен в классе, то класс должен объявить как абстрактный класс.

  • Абстрактный метод должен содержать только определение метода, не должен Содержите тело метода/реализацию.

  • В производном классе должен быть описан абстрактный метод.

Виртуальный метод:

  • Виртуальные методы могут переместиться в производном классе, но не обязательное.
  • Виртуальные методы должны иметь тело/реализацию метода с определением.

Пример:

public abstract class baseclass
        {
            public abstract decimal getarea(decimal Radius);

            public virtual decimal interestpermonth(decimal amount)

            {
                return amount*12/100;
            }
            public virtual decimal totalamount(decimal Amount,decimal principleAmount)
            {
                return Amount + principleAmount;
            }
        }

        public class derivedclass:baseclass
        {
            public override decimal getarea(decimal Radius)
            {
                return 2 * (22 / 7) * Radius;
            }
            public override decimal interestpermonth(decimal amount)
            {
                return amount * 14 / 100;
            }

        }