Подтвердить что ты не робот

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

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

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
}
4b9b3361

Ответ 1

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

public abstract void TurnRight();

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

Ответ 2

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

Ответ 3

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

 public abstract void TurnRight();

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

Ответ 4

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

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, и большую часть времени он медленнее, потому что отношения наследования класса анализируются во время выполнения. (aka vtable)

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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