Méthodes virtuelles pures en C#?
On m'a dit de faire mon résumé de classe:
public abstract class Airplane_Abstract
Et pour créer une méthode appelée 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));
}
Et que 4 autres méthodes devraient être des " méthodes virtuelles pures." Qu'est-ce que c'est exactement?
Ils ressemblent tous à ceci en ce moment:
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 réponses
Je suppose que celui qui vous a dit d'écrire une méthode "pure virtuelle" était un programmeur C++ plutôt qu'un programmeur C#... mais l'équivalent est une méthode abstraite:
public abstract void TurnRight();
Cela force les sous-classes concrètes à remplacer TurnRight
avec une implémentation réelle.
"virtuel pur" est une terminologie C++. L'équivalent C# est une méthode abstraite.
Ils signifient probablement que les méthodes doivent être marquées abstract
.
public abstract void TurnRight();
Vous devrez alors les implémenter dans les sous-classes, par opposition à une méthode virtuelle vide, où la sous-classe n'aurait pas à la remplacer.
Ou même vous pouvez aller interface, pensé une petite limitation est nécessaire:
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...
}
}
Cependant, vous devrez implémenter tous les la déclaration de fonction de IControllable
et ITurnable
assignés, sinon une erreur de compilateur se produira. Si vous voulez une implémentation virtuelle facultative, vous devez aller abstract class
pour la méthode virtuelle avec interface
pour la méthode virtuelle pure.
En fait, il y a une différence entre interface
Fonction et abstract
fonction, que interface
seulement déclare la fonction , toutes les fonctions interface
doivent être publiques, donc il n'y a pas de propriété de classe de fantaisie telle que private
ou protected
donc c'est très rapide, alors que abstract
sont méthode de classe réelle sans implémentation et force l'implémentation dans la classe dérivée , donc vous pouvez private
, protected
et accédez aux variables membres avec des fonctions abstract
, et la plupart du temps c'est plus lent car les relations d'héritage de classe sont analysées au moment de l'exécution. (aka vtable)
Vous n'avez alors pas d'implémentation dans la classe Airplane_Abstract mais forcez les consommateurs "héritiers" de la classe à les implémenter.
La classe Airplane_Abstract est inutilisable tant que vous n'héritez pas et n'implémentez pas les fonctions abstraites.
Une fonction virtuelle pure est une terminologie de C++ mais en C # si une fonction qui est implémentée dans une classe dérivée et cette classe dérivée n'est pas une classe abstraite.
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
" en programmation orientée objet, une fonction virtuelle ou une méthode virtuelle est une fonction ou une méthode dont le comportement peut être remplacé dans une classe héritée par une fonction avec la même signature."
Google est toujours votre ami.