在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... } }
但是,您将不得不实现 IControllable
和ITurnable
所有函数声明都已分配,否则会发生编译器错误。 如果你想要可选的虚拟实现,你将不得不abstract class
为虚拟方法与纯虚拟方法的interface
。
事实上, interface
函数和abstract
函数是有区别的, interface
只声明函数 ,所有的interface
函数都要全部公开,所以没有private
或者protected
等花哨的类属性,所以速度非常快,而abstract
函数是实际的类方法,并强制派生类中的实现 ,因此可以将private
, protected
和访问成员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永远是你的朋友。