Чистые виртуальные методы в C #? - PullRequest
38 голосов
/ 09 февраля 2011

Мне сказали сделать мой класс абстрактным:

public abstract class Airplane_Abstract

И сделать метод с именем Move Virtual

 public virtual void Move()
        {
            //use the property to ensure that there is a valid position object
            double radians = PlanePosition.Direction * (Math.PI / 180.0);

            // change the x location by the x vector of the speed
            PlanePosition.X_Coordinate += (int)(PlanePosition.Speed * Math.Cos(radians));

            // change the y location by the y vector of the speed
            PlanePosition.Y_Coordinate += (int)(PlanePosition.Speed * Math.Sin(radians));
        }

И эти 4 других метода должны быть «чисто виртуальными методами». Что это такое?

Они все сейчас выглядят так:

public virtual void TurnRight()
{
    // turn right relative to the airplane
    if (PlanePosition.Direction >= 0 && PlanePosition.Direction < Position.MAX_COMPASS_DIRECTION)
        PlanePosition.Direction += 1;
    else
        PlanePosition.Direction = Position.MIN_COMPASS_DIRECTION;  //due north
}

Ответы [ 7 ]

72 голосов
/ 09 февраля 2011

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

public abstract void TurnRight();

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

11 голосов
/ 09 февраля 2011

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

8 голосов
/ 09 февраля 2011

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

 public abstract void TurnRight();

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

4 голосов
/ 22 января 2016

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

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

class Derivered : PureVirtual
{
    public override void PureVirtualMethod()
    {
        Console.WriteLine("I'm pure virtual function");
    }
}
4 голосов
/ 16 марта 2015

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

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 присвоили, иначе произойдет ошибка компилятора.Если вы хотите опциональную виртуальную реализацию, вам придется пойти abstract class для виртуального метода с interface для чисто виртуального метода.

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

2 голосов
/ 09 февраля 2011

В этом случае у вас нет реализации в классе Airplane_Abstract, но вынуждаете потребителей «наследников» класса к их реализации.

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

1 голос
/ 09 февраля 2011

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

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

Google всегда твой друг.

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