web-dev-qa-db-de.com

Reine virtuelle Methoden in C #?

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
}
38
David Brewer

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.

74
Jon Skeet

"Reine virtuelle" ist C++ - Terminologie. Das C # -Äquivalent ist eine abstrakte Methode.

11
David Yaw

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.

8
Justin

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)

4
Steve Fan

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");
    }
}
4
AuserP

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.

2
AnthonyLambert

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.

1
dotalchemy