В чем разница между абстрактной функцией и виртуальной функцией?

Предполагаю, что вы хотите рассматривать «123.456» как целое значение, и в этом случае вы передадите его оптовой парсером, если вам не нужно каким-либо образом его кодировать, например

struct DecimalRep{
    double mantissa,
    double exponent 

}

, но я думаю, все зависит от того, что ожидает парсер.

1481
задан Guillaume D 7 June 2019 в 14:51
поделиться

9 ответов

абстрактная функция не может иметь функциональности. Вы в основном говорите, любой дочерний класс ДОЛЖЕН дать их собственную версию этого метода, однако это является слишком общим, чтобы даже попытаться реализовать в родительском классе.

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

2576
ответ дан AMing 7 June 2019 в 14:51
поделиться

Абстрактная функция не имеет никакого implemention, и она может только быть объявлена на абстрактном классе. Это вынуждает производный класс обеспечить реализацию.

виртуальная функция А обеспечивает реализацию по умолчанию, и она может существовать или на абстрактном классе или на неабстрактном классе.

Так, например:

public abstract class myBase
{
    //If you derive from this class you must implement this method. notice we have no method body here either
    public abstract void YouMustImplement();

    //If you derive from this class you can change the behavior but are not required to
    public virtual void YouCanOverride()
    { 
    }
}

public class MyBase
{
   //This will not compile because you cannot have an abstract method in a non-abstract class
    public abstract void YouMustImplement();
}
275
ответ дан Franco Roura 7 June 2019 в 14:51
поделиться

Необходимо всегда переопределять абстрактную функцию.

Таким образом:

  • Абстрактные функции - когда наследник должен обеспечить его собственную реализацию
  • Виртуальный - когда это до наследника для решения
58
ответ дан Peter Mortensen 7 June 2019 в 14:51
поделиться

Вы в основном используете виртуальный метод, когда хотите, чтобы наследники расширяли функциональность, ЕСЛИ они хотят.

Вы используйте абстрактные методы, когда вы хотите, чтобы наследники реализовали функциональность (и в этом случае у них нет выбора)

3
ответ дан 22 November 2019 в 20:15
поделиться

Абстрактные методы всегда виртуальны. Они не могут иметь реализацию.

В этом главное отличие.

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

С помощью абстрактный метод, вы заставляете потомков предоставлять реализацию.

10
ответ дан 22 November 2019 в 20:15
поделиться

Абстрактный метод - это метод, который должен быть реализован для создания конкретного класса. Объявление находится в абстрактном классе (и любой класс с абстрактным методом должен быть абстрактным классом), и оно должно быть реализовано в конкретном классе.

Виртуальный метод - это метод, который можно переопределить в производном классе с помощью переопределить, заменить поведение в суперклассе. Если вы не переопределите, вы получите оригинальное поведение. Если вы делаете, вы всегда получаете новое поведение. Это противоположно не виртуальным методам, которые не могут быть переопределены, но могут скрыть оригинальный метод. Это делается с помощью нового модификатора .

См. Следующий пример:

public class BaseClass
{
    public void SayHello()
    {
        Console.WriteLine("Hello");
    }


    public virtual void SayGoodbye()
    {
        Console.WriteLine("Goodbye");
    }

    public void HelloGoodbye()
    {
        this.SayHello();
        this.SayGoodbye();
    }
}


public class DerivedClass : BaseClass
{
    public new void SayHello()
    {
        Console.WriteLine("Hi There");
    }


    public override void SayGoodbye()
    {
        Console.WriteLine("See you later");
    }
}

Когда я создаю экземпляр DerivedClass и вызываю SayHello или SayGoodbye , Я получаю «Привет!» И «Увидимся позже». Если я позвоню HelloGoodbye , я получу «Привет» и «Увидимся позже». Это потому, что SayGoodbye является виртуальным и может быть заменен производными классами. SayHello только скрыт, поэтому, когда я вызываю это из своего базового класса, я получаю свой оригинальный метод.

Абстрактные методы неявно являются виртуальными. Они определяют поведение, которое должно присутствовать, больше как интерфейс.

Абстрактные методы неявно виртуальны. Они определяют поведение, которое должно присутствовать, больше как интерфейс.

Абстрактные методы неявно виртуальны. Они определяют поведение, которое должно присутствовать, больше как интерфейс.

22
ответ дан 22 November 2019 в 20:15
поделиться

Абстрактный метод: Когда класс содержит абстрактный метод, этот класс должен быть объявлен как абстрактный. Абстрактный метод не имеет реализации, и, следовательно, классы, производные от этого абстрактного класса, должны обеспечивать реализацию этого абстрактного метода.

Виртуальный метод: Класс может иметь виртуальный метод. Виртуальный метод имеет реализацию. Когда вы наследуете от класса, имеющего виртуальный метод, вы можете переопределить виртуальный метод и предоставить дополнительную логику или заменить логику своей собственной реализацией.

Когда использовать что: В некоторых случаях вы знаете, что определенные типы должны иметь определенный метод, но вы не знаете, какую реализацию должен иметь этот метод.
В таких случаях вы можете создать интерфейс, который содержит метод с этой подписью. Однако, если у вас есть такой случай, но вы знаете, что разработчики этого интерфейса также будут иметь другой общий метод (для которого вы уже можете предоставить реализацию), вы можете создать абстрактный класс. Затем этот абстрактный класс содержит абстрактный метод (который должен быть переопределен) и другой метод, который содержит «общую» логику.

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

29
ответ дан 22 November 2019 в 20:15
поделиться
  1. Только абстрактные классы могут иметь абстрактных членов .
  2. Не абстрактный класс , который наследуется от абстрактного класса , должен переопределить своих абстрактных членов.
  3. абстрактный член является неявно виртуальным .
  4. абстрактный член не может обеспечить какую-либо реализацию ( абстрактный называется pure virtual на некоторых языках).
78
ответ дан 22 November 2019 в 20:15
поделиться

Если класс происходит из этого абстрактного класса, он тогда вынужден переопределить абстрактного участника. Это отличается от виртуального модификатора, который определяет, что участник может дополнительно быть переопределен.

0
ответ дан 22 November 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: