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
}
36
demandé sur Kara 2011-02-09 21:35:23

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.

67
répondu Jon Skeet 2011-02-09 18:36:43

"virtuel pur" est une terminologie C++. L'équivalent C# est une méthode abstraite.

10
répondu David Yaw 2011-02-09 18:36:53

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.

7
répondu Justin 2011-02-09 18:36:31

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)

4
répondu Steve Fan 2015-03-16 05:50:46

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.

2
répondu AnthonyLambert 2011-02-09 18:38:18

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");
    }
}
2
répondu AuserP 2016-01-22 08:29:00

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.

1
répondu dotalchemy 2011-02-09 18:38:09