Różnica pomiędzy Abstract a Virtual 14849 3

O temacie

Autor Sawik

Zaczęty 4.04.2016 roku

Wyświetleń 14849

Odpowiedzi 3

Sawik

Sawik

Użytkownicy
Rebel
posty4772
Propsy3197
ProfesjaNierób
  • Użytkownicy
  • Rebel
Ostatnio znajduję coraz więcej wolnego czasu dlatego powoli wracam do programowania żeby go sobie czymś wypełnić.
Generalnie do tej pory jak muł bawiłem się w pisanie tysięcy wyjątków i wielokrotne edytowanie kodu z przed paru miesięcy w celu dodania kolejnego wyjątku, w większości wypadków powinny pomóc mi metody virtual/abstract, jednak mam lekki problem z wyobrażeniem sobie sytuacji w której kiedykolwiek chciałbym użyć abstract.

Załóżmy że mam dwie klasy:
Wersja virtual
public class BaseClass
{
public void SayHello()
{
print("Hello");
}


public void SayGoodbye ()
{
print("Goodbye");
}


}
public class DerivedClass : BaseClass
{
public new void SayHello()
{

print("Hi There");
}


public new void SayGoodbye()
{
base.SayGoodbye();
EndProgram(); // Raczej oczywiste, ale - metoda kończąca program
}
}
wersja abstract
public abstract class BaseClass
{
public void SayHello()
{
print("Hello");
}


public abstract void SayGoodbye ();

}
public class DerivedClass : BaseClass
{
public new void SayHello()
{
print("Hi There");
}


public override void SayGoodbye()
{
print("Goodbye");
}
}
 


Nie rozumiem dlaczego chciałbym pozbawiać się podstawowej definicji metody biorąc pod uwagę fakt że używając virtual otrzymuję to samo, jednocześnie zachowując możliwość wywołania wersji bazowej, czyli nie muszę pisać części wspólnych ponownie. Jeżeli klasy dziedziczące nie miałyby cech wspólnych dlaczego chciałbym tę metodę deklarować w klasie podstawowej?
 
Życzę wam seksu analnego po stronie biernej.
Dropbox +500 mb na start
LowPoly
Wykonanie modelu niskopoligonowego to sztuka kompromisu. Nie jest to jedynie uproszczenie modelu wysokopoligonowego, ale głęboka modyfikacja oraz podejmowanie decyzji często zmieniających wygląd pierwotny obiektu, tak by przy najmniejszej ilości trójkątów uzyskać jak najwierniej odwzorowany kształt oryginału. Nie można też zapomnieć o tym iż musi nadal wyglądać przekonywająco i tak balansować by uzyskać efekt optymalny.

Podstawowym założeniem jest, że model nie powinien mieć zbędnych, niewidocznych dla gracza detali włączonych w geometrie. Większość obiektów jakie znajdują się w grze powinna prezentować się najlepiej z odległości około 3-5 metrów. Wszelkie detale, które zanikają, wydają się płaskie lub zlewają się z bryłą modelu należy uznać za zbędne i pozostawić je na normal mapie.

Fakt, iż gracz będzie w stanie podejść bliżej do obiektu i zobaczyć go z mniejszej niż 3m odległości nie powinno stanowić większego problemu, gdyż większą rolę odgrywają wtedy tekstury oraz dodatkowy detal zależny od materiału obiektu. To właśnie kompromis między wydajnością, a szczegółowością otoczenia.

Detal, którego nie widać z 3-5 metrów nie powinnien istnieć w geometrii modelu.
Krawędzie znajdujące się blisko siebie, które zlewają się z większej odległości należy uprościć do wspólnej płaszczyzny

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Abstract używasz wtedy kiedy tworzysz klasę która nie jest gotowa do użycia - bo na przykład jej fragment będzie musiał występować w wielu wariantach, implementowanych w klasach dziedziczących z tej.
Zostawienie zamiast tego pustej nie-abstrakcyjnej metody byłoby strasznym błędem, bo ktoś mógłby takiej klasy użyć nie wiedząc że nie spełnia ona kontraktu który deklaruje nagłówkami swoich metod. Użycie słowa kluczowego abstract zapobiega tej sytuacji, bo uniemożliwia zinstancjonowanie obiektu czysto tej klasy.

Sawik

Sawik

Użytkownicy
Rebel
posty4772
Propsy3197
ProfesjaNierób
  • Użytkownicy
  • Rebel
Czyli jest to tylko i wyłącznie zabezpieczenie, w żadnych innych różnic nie ma? Oczywiście poza dwoma faktami, klasy abstract nie mogę zinstancjować natomiast metoda abstract nie może posiadać ciała.
 
Życzę wam seksu analnego po stronie biernej.
Dropbox +500 mb na start
LowPoly
Wykonanie modelu niskopoligonowego to sztuka kompromisu. Nie jest to jedynie uproszczenie modelu wysokopoligonowego, ale głęboka modyfikacja oraz podejmowanie decyzji często zmieniających wygląd pierwotny obiektu, tak by przy najmniejszej ilości trójkątów uzyskać jak najwierniej odwzorowany kształt oryginału. Nie można też zapomnieć o tym iż musi nadal wyglądać przekonywająco i tak balansować by uzyskać efekt optymalny.

Podstawowym założeniem jest, że model nie powinien mieć zbędnych, niewidocznych dla gracza detali włączonych w geometrie. Większość obiektów jakie znajdują się w grze powinna prezentować się najlepiej z odległości około 3-5 metrów. Wszelkie detale, które zanikają, wydają się płaskie lub zlewają się z bryłą modelu należy uznać za zbędne i pozostawić je na normal mapie.

Fakt, iż gracz będzie w stanie podejść bliżej do obiektu i zobaczyć go z mniejszej niż 3m odległości nie powinno stanowić większego problemu, gdyż większą rolę odgrywają wtedy tekstury oraz dodatkowy detal zależny od materiału obiektu. To właśnie kompromis między wydajnością, a szczegółowością otoczenia.

Detal, którego nie widać z 3-5 metrów nie powinnien istnieć w geometrii modelu.
Krawędzie znajdujące się blisko siebie, które zlewają się z większej odległości należy uprościć do wspólnej płaszczyzny

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Klasę abstrakcyjną tworzysz wtedy, gdy masz pewną rodzinę obiektów. Obiekty te należą do jakiejś hierarchii, są podobne, ale mają różnice. Weźmy na przykład figury geometryczne. Każda figura ma jakieś pole i obwód. Czy jesteś w stanie zdefiniować wzory dla obiektu figura? Nie. A dla kwadratu i prostokąta? Tak. Jeśli masz metodę abstrakcyjną, to dzięki temu możesz wywołać na wszystkich obiektach typu kwadrat oraz prostokąt metodę oblicz pole, mimo że ich implementacja będzie inna.
Po co metody wirtualne? Może się okazać, że w większości przypadków metoda z klasy bazowej nadaje się dla obiektów z klas pochodnych. Jeśli okaże się, że w klasie pochodnej należy zmienić metodę, to zmienisz ją tylko w klasie pochodnej, w pozostałych klasach będzie wywoływana metoda z klasy bazowej.


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry