Разница между виртуальными и абстрактными методами
Вот код из 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.
}
}
Может ли кто-нибудь объяснить приведенный выше код в отношении различий между абстрактными и виртуальными методами?
Ответы
Ответ 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;
}
}