Чисто виртуальные методы в C#?

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

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 ответов


public abstract void TurnRight();

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


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


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

 public abstract void TurnRight();

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


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

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 для чистого виртуального метода.

в самом деле, есть разница между


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

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


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

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

class Derivered : PureVirtual
{
    public override void PureVirtualMethod()
    {
        Console.WriteLine("I'm pure virtual function");
    }
}

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

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

Google всегда ваш друг.