2011-02-09 18 views
34

Powiedziano mi, aby moja klasa abstrakcyjna „czystych metod wirtualnych”Czyste metody wirtualne w języku C#?

public abstract class Airplane_Abstract 

I aby metoda nazywa się przenieść wirtualne

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)); 
     } 

I 4 inne metody powinny być Co to dokładnie jest?

Wszyscy wyglądają jak to teraz:

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 
} 
+2

Gdy zainteresowany, do dyskusji na temat czystych wirtualnych i innych czystych funkcji wirtualnych (wady i zalety), będę egoistycznie przekierować do dnia [blogu] (http://whathecode.wordpress.com/2010/ 12/20/abstrakcja-jest-wszystko /) mnie. :) –

+0

lol. Założę się, że to dobry post. –

Odpowiedz

63

Domyślam się, że każdy, kto ci powiedział napisać „pure virtual” metoda była programista C++ zamiast C# programista ... ale odpowiednikiem jest abstrakcyjna metoda:

public abstract void TurnRight(); 

To wymusza konkretne podklasy zastąpić TurnRight prawdziwą implementacją.

+0

Czy to oznacza, że ​​każdy fragment treści powinien zostać usunięty? o.o Tak wygląda. –

+1

@allthosemiles: Dla metod abstrakcyjnych, tak. Punktem abstrakcyjnej metody jest to, że * nie ma * ciała. –

+9

pure virtual to [nazwa ogólna] (http://en.wikipedia.org/wiki/Virtual_function#Abstract_classes_and_pure_virtual_functions), a nie język specyficzny –

6

Prawdopodobnie oznacza to, że metody powinny być oznakowane abstract.

public abstract void TurnRight(); 

Następnie trzeba je realizować w podklas, w przeciwieństwie do pustej metody wirtualnej, gdzie podklasa nie będzie musiał go zastąpić.

9

"Czysty wirtualny" to terminologia C++. Odpowiednik C# jest metodą abstrakcyjną.

1

http://en.wikipedia.org/wiki/Virtual_function

„W programowaniu obiektowym, funkcja wirtualnego lub metoda wirtualna jest funkcja lub metoda, których zachowanie może być zmienione w obrębie klasy dziedziczenie przez funkcję z tym samym podpisem.”

Google zawsze jest twoim przyjacielem.

+1

Zapomniałeś wspomnieć, że nadpisywanie jest obowiązkowe. – Skyline

2

Nie posiadasz wtedy implementacji w klasie Airplane_Abstract, ale zmuszasz konsumentów "spadkobierców" klasy do ich implementacji.

Klasa Airplane_Abstract nie nadaje się do użytku, dopóki nie zostanie dziedziczona i nie zostanie zastosowana funkcja abstrakcyjna.

4

Lub nawet można przejść interfejs, pomyślał trochę mało ograniczenie jest wymagane:

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... 
    } 
} 

Jednak trzeba będzie wdrożyć wszystkie deklarację funkcją zarówno IControllable i ITurnable przypisano, inaczej błąd kompilatora wystąpi. Jeśli chcesz opcjonalnej implementacji wirtualnej, musisz przejść abstract class dla metody wirtualnej z interface dla czystej metody wirtualnej.

W rzeczywistości, istnieje różnica między interface funkcji i abstract funkcji, które interface deklaruje tylko funkcja, wszystko interface funkcja musiał przejść całą publiczną więc nie fantazyjny klasa własności takie jak private lub protected więc jest bardzo szybki, podczas abstract funkcja są rzeczywista metoda klasy bez realizacji i wymusza wdrożenie w klasie pochodnej, dzięki czemu można umieścić private, protected i członek dostęp zmienne z abstract funkcji, a większość czasu jest wolniejszy, ponieważ relacje dziedziczenia klas są analizowane w czasie wykonywania. (aka vtable)

2

Czysta funkcja wirtualna to terminologia C++, ale w języku C#, jeśli funkcja zaimplementowana w klasie pochodnej i ta klasa pochodna nie jest klasą abstrakcyjną.

abstract class PureVirtual 
{ 
    public abstract void PureVirtualMethod(); 
} 

class Derivered : PureVirtual 
{ 
    public override void PureVirtualMethod() 
    { 
     Console.WriteLine("I'm pure virtual function"); 
    } 
} 
Powiązane problemy