Что такое Виртуальные Методы?

Вы не ждете результата. Метод enqueue() выполняет запрос асинхронно. Это означает, что обратный вызов не будет происходить в том же потоке. После того как вы сделали enqueue() вызов, assert будет немедленно вызван следующим. На данный момент ни один обратный вызов еще не был вызван, поэтому значение token еще не изменилось. Если вы хотите синхронно ждать результата, используйте execute() вместо enqueue().

69
задан HerbalMart 6 August 2014 в 08:11
поделиться

8 ответов

Виртуальный Модификатор используется для маркировки этого, method\property (ect) может быть изменен в производном классе при помощи переопределение модификатор.

Пример:

class A
{
    public virtual void Foo()
       //DoStuff For A
}

class B : A
{
    public override void Foo()
    //DoStuff For B

    //now call the base to do the stuff for A and B 
    //if required
    base.Foo()
}
50
ответ дан cgreeno 24 November 2019 в 13:45
поделиться

Само собой разумеется, виртуальные методы пригождаются, когда Ваш код пытается пребывать с эти , Открывают Closed Principle

Read More об Открыть Closed Principle здесь , исходное техническое описание Дяди Bob OCP.

Также знать, что методы не виртуальные по умолчанию в C# в отличие от Java.

1
ответ дан abhilash 24 November 2019 в 13:45
поделиться

Чтобы быть в состоянии переопределить его в наследующих классах.

Выезд запись MSDN для ключевого слова. Это объясняет это больше подробно.

3
ответ дан PHeiberg 24 November 2019 в 13:45
поделиться

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

5
ответ дан cyclo 24 November 2019 в 13:45
поделиться

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

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

6
ответ дан tvanfosson 24 November 2019 в 13:45
поделиться

Виртуальные Методы на MSDN

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

, Когда виртуальный метод вызывается, тип выполнения объекта проверяется на переопределяющего участника. Переопределяющего участника в большей части производного класса звонят, который мог бы быть исходным участником, если никакой производный класс не переопределил участника. (Для получения дополнительной информации о типе выполнения и наиболее полученной реализации, см. 10.5.3 Виртуальных методов.)

По умолчанию, методы являются невиртуальными. Вы не можете переопределить невиртуальный метод.

Вы не можете использовать виртуальный модификатор со следующими модификаторами:

статичный переопределение краткого обзора

свойства Virtual ведут себя как абстрактные методы, за исключением различий в синтаксисе вызова и объявлении.

  • Это - ошибка использовать виртуальный модификатор на статическом свойстве.
  • А виртуальное унаследованное свойство может быть переопределено в производном классе включением объявления свойства, которое использует модификатор переопределения.
13
ответ дан Russ Cam 24 November 2019 в 13:45
поделиться

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

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

21
ответ дан JaredPar 24 November 2019 в 13:45
поделиться

Virtual allows an inheriting class to replace a method that the base class then uses.

public class Thingy
{
    public virtual void StepA()
    {
        Console.Out.WriteLine("Zing");
    }

    public void Action()
    {
        StepA();
        Console.Out.WriteLine("A Thingy in Action.");
    }
}

public class Widget : Thingy
{
    public override void StepA()
    {
        Console.Out.WriteLine("Wiggy");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Thingy thingy = new Thingy();
        Widget widget = new Widget();

        thingy.Action();
        widget.Action();

        Console.Out.WriteLine("Press any key to quit.");
        Console.ReadKey();
    }
 }

When you run the Program your output will be:

Zing 
A Thingy in Action. 
Wiggy 
A Thingy in Action.

Notice how even though Widget called the Action() method defined at the Thingy level, internally Thingy called Widget's StepA() method.

The basic answer is it gives inheritors of a class more flexibility. Of course, you've got to engineer your class well or it could weak havoc.

42
ответ дан 24 November 2019 в 13:45
поделиться
Другие вопросы по тегам:

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