что является целью чистой виртуальной функции, когда у нас уже есть абстрактная функция в C # [duplicate]

Из комментариев справочной страницы php date() :


У вас был «Y» правильный - это полный год, но «M» - это три символа месяца, а «м» - двухзначный месяц. Такая же проблема с «D» вместо «d». «G» - это 1 или 2-значный час, где «H» всегда имеет преимущество 0 при необходимости.

35
задан Kara 29 June 2013 в 00:52
поделиться

7 ответов

Я предполагаю, что тот, кто сказал вам написать «чистый виртуальный» метод, был программистом на C ++, а не программистом на C # ... но эквивалент является абстрактным методом:

public abstract void TurnRight();

Это заставляет конкретные подклассы для переопределения TurnRight с реальной реализацией.

66
ответ дан Jon Skeet 17 August 2018 в 14:09
поделиться
  • 1
    @allthosemiles: Для абстрактных методов, да. Точка абстрактного метода состоит в том, что он не имеет тела. – Jon Skeet 9 February 2011 в 19:38
  • 2
    pure virtual - это общее имя , а не конкретный язык – Steven Jeuris 9 February 2011 в 19:39
  • 3
    @Steven: Хм ... возможно, но я только когда-либо видел это в контексте C ++ раньше. Я подозреваю, что любой, кто говорит о них, скорее всего, будет иметь фон на C ++ :) – Jon Skeet 9 February 2011 в 20:04
  • 4
    @Steven: Да, я думаю, это почти наверняка объяснение. – Jon Skeet 9 February 2011 в 20:20
  • 5
    @ Jon Skeet: Кажется, вы были правы. Также кажется, что отсутствует последовательное именование, хотя я нашел научную статью, которая пытается обобщить некоторые термины. О, и, вероятно, кто-то должен отредактировать википедию. :) – Steven Jeuris 15 February 2011 в 13:19

У вас тогда нет реализации в классе Airplane_Abstract, но они вынуждают потребители «наследовать» класса для их реализации.

Класс Airplane_Abstract непригоден до тех пор, пока вы не наследуете и не выполняете абстрактные функции.

2
ответ дан AnthonyLambert 17 August 2018 в 14:09
поделиться

Чистая виртуальная функция - это терминология C ++, но в C #, если функция, которая реализована в классе Derived, и этот производный класс не является абстрактным классом.

abstract class PureVirtual
{
    public abstract void PureVirtualMethod();
}

class Derivered : PureVirtual
{
    public override void PureVirtualMethod()
    {
        Console.WriteLine("I'm pure virtual function");
    }
}
2
ответ дан AuserP 17 August 2018 в 14:09
поделиться

«Чистая виртуальная» - это терминология C ++. C # эквивалент - абстрактный метод.

9
ответ дан David Yaw 17 August 2018 в 14:09
поделиться

http://en.wikipedia.org/wiki/Virtual_function

«В объектно-ориентированном программировании виртуальная функция или виртуальный метод - это функция или метод, поведение которых может быть переопределено внутри наследующего класса функцией с той же сигнатурой ».

Google всегда является вашим другом.

1
ответ дан dotalchemy 17 August 2018 в 14:09
поделиться
  • 1
    Вы забыли упомянуть, что переопределение является обязательным. – Abdellah IDRISSI 26 October 2015 в 11:44

Вероятно, они означают, что методы должны быть помечены abstract.

 public abstract void TurnRight();

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

6
ответ дан Justin 17 August 2018 в 14:09
поделиться

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

public interface IControllable
{
    void Move(int step);
    void Backward(int step);
}

public interface ITurnable
{
   void TurnLeft(float angle);
   void TurnRight(float angle);
}

public class Airplane : IControllable, ITurnable
{
   void Move(int step)
   {
       // TODO: Implement code here...
   }
   void Backward(int step)
   {
       // TODO: Implement code here...
   }
   void TurnLeft(float angle)
   {
       // TODO: Implement code here...
   }
   void TurnRight(float angle)
   {
       // TODO: Implement code here...
   }
}

Однако вам придется реализовать все объявление функции как IControllable, так и ITurnable в противном случае произойдет ошибка компилятора. Если вам нужна дополнительная реализация virutal, вам нужно будет пойти abstract class для виртуального метода с interface для чистого виртуального метода.

На самом деле существует разница между функцией interface и abstract функция interface объявляет только функцию, вся функция interface должна быть общедоступной, поэтому нет свойства fancy class, такого как private или protected, поэтому она очень быстрая, а функция abstract - это метод фактического класса без реализация и принудительное выполнение в производном классе, поэтому вы можете поместить private, protected и переменные-члены доступа с функциями abstract, и большую часть времени это медленнее, потому что отношения наследования класса анализируются во время выполнения. (aka vtable)

4
ответ дан Steve Fan 17 August 2018 в 14:09
поделиться
Другие вопросы по тегам:

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