Mir wurde gesagt, dass ich meine Klasse abstrakt machen soll:
public abstract class Airplane_Abstract
Und um eine Methode namens Move Virtual zu machen
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));
}
Und die 4 anderen Methoden sollten "rein virtuelle Methoden" sein. Was ist das genau
Sie sehen jetzt alle so aus:
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
}
Ich vermute, wer auch immer Ihnen gesagt hat, dass Sie eine "rein virtuelle" Methode schreiben sollen, war ein C++ - Programmierer und kein C # -Programmierer ... aber das Äquivalent ist eine abstrakte Methode:
public abstract void TurnRight();
Das zwingt konkrete Unterklassen, TurnRight
mit einer echten Implementierung zu überschreiben.
"Reine virtuelle" ist C++ - Terminologie. Das C # -Äquivalent ist eine abstrakte Methode.
Sie bedeuten wahrscheinlich, dass die Methoden mit abstract
markiert werden sollten.
public abstract void TurnRight();
Sie müssen sie dann in den Unterklassen implementieren, im Gegensatz zu einer leeren virtuellen Methode, bei der die Unterklasse sie nicht überschreiben müsste.
Oder Sie können sogar auf die Benutzeroberfläche zugreifen, obwohl eine kleine Einschränkung erforderlich ist:
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...
}
}
Sie müssen jedoch alles implementieren die Funktionsdeklaration sowohl von IControllable
als auch von ITurnable
zugewiesen haben, da sonst ein Compilerfehler auftritt. Wenn Sie eine optionale virutale Implementierung wünschen, müssen Sie abstract class
für virtuelle Methode mit interface
für reine virtuelle Methode.
Tatsächlich gibt es einen Unterschied zwischen der Funktion interface
und der Funktion abstract
, dass interface
nur die Funktion deklariert, alle interface
function muss vollständig öffentlich sein, damit es keine ausgefallenen Klasseneigenschaften wie private
oder protected
gibt. Dies ist also sehr schnell, während abstract
function tatsächliche Klassenmethode ohne Implementierung und erzwingt die Implementierung in der abgeleiteten Klasse, sodass Sie private
, protected
setzen und mit abstract
auf Mitgliedsvariablen zugreifen können ] _ funktioniert und meistens es ist langsamer, weil die Klassenvererbungsrelationen zur Laufzeit analysiert werden. (aka vtable)
Eine reine virtuelle Funktion ist eine Terminologie von C++, jedoch in C #, wenn eine Funktion, die in der abgeleiteten Klasse und dieser abgeleiteten Klasse implementiert ist, keine abstrakte Klasse ist.
abstract class PureVirtual
{
public abstract void PureVirtualMethod();
}
class Derivered : PureVirtual
{
public override void PureVirtualMethod()
{
Console.WriteLine("I'm pure virtual function");
}
}
Sie haben dann keine Implementierung in der Klasse "Airplane_Abstract", sondern zwingen die "Erben" der Klasse für die Verbraucher, diese zu implementieren.
Die Airplane_Abstract-Klasse kann erst verwendet werden, wenn Sie die abstrakten Funktionen erben und implementieren.
http://en.wikipedia.org/wiki/Virtual_function
"Bei der objektorientierten Programmierung ist eine virtuelle Funktion oder virtuelle Methode eine Funktion oder Methode, deren Verhalten innerhalb einer erbenden Klasse von einer Funktion mit derselben Signatur überschrieben werden kann."
Google ist immer dein Freund.