Чисто виртуальные методы в 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
с реальной реализацией.
они, вероятно, означают, что методы должны быть отмечены 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 всегда ваш друг.