在C#中的纯虚拟方法?

我被告知让我的课程摘要:

public abstract class Airplane_Abstract 

并且做一个叫虚拟的方法

  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 } 

我的猜测是,无论谁告诉你写一个“纯粹的虚拟”的方法是一个C ++程序员,而不是一个C#程序员…但相当于一个抽象的方法:

 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... } } 

但是,您将不得不实现 IControllableITurnable 所有函数声明都已分配,否则会发生编译器错误。 如果你想要可选的虚拟实现,你将不得不abstract class为虚拟方法与纯虚拟方法的interface

事实上, interface函数和abstract函数是有区别的, interface只声明函数 ,所有的interface函数都要全部公开,所以没有private或者protected等花哨的类属性,所以速度非常快,而abstract函数是实际的类方法,强制派生类中的实现 ,因此可以将privateprotected和访问成员variables与abstract函数一起使用,而且大多数时候由于在运行时分析类inheritance关系而速度较慢 。 (又名vtable)

然后,您在Airplane_Abstract类中没有实现,但迫使消费者“类的inheritance者”来实现它们。

Airplane_Abstract类在inheritance和实现抽象函数之前是不可用的。

纯虚函数是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

“在面向对象编程中,虚拟函数或虚拟方法是一种函数或方法,其行为可以通过具有相同签名的函数在inheritance类中重写。

Google永远是你的朋友。