Metody wirtualne i override

2008-08-29 15:43

W wielu językach obiektowych występuje słowo kluczowe override, którego dodawanie jest obowiązkowe podczas nadpisywania metod wirtualnych w klasach pochodnych (w przeciwnym wypadku generowanie jest ostrzeżenie). Jak można się spodziewać, C++ do takich języków nie należy :) A szkoda, bo wymóg stosowania override zapobiega pomyłkom przy nadpisywaniu (np. literówkom w nazwach metod), które można wykryć dopiero w trakcie działania programu, gdy ze zdziwieniem odkrywamy, że zamiast nowej wersji metody wywoływana jest stara.

Można częściowo temu zaradzić, ale sposób jest brzydki. Polega on na stworzeniu makra zawierającego całą definicję klasy (albo przynajmniej deklaracje jej metod wirtualnych):

  1. #define DECLARE_FOO(__suffix__) \
  2.     public: \
  3.         virtual void AbstractDoSomething() __suffix__; \
  4.         virtual void DoSomethingElse();

Następnie używamy go zarówno w definicji klasy bazowej, jak i pochodnych:

  1. class Foo
  2. {
  3.     DECLARE_FOO(=0)
  4. };
  5.  
  6. class Bar : public Foo
  7. {
  8.     DECLARE_FOO( )
  9. };

Dodatkowy parametr pozwala odróżnić obie sytuacje, co jest koniecznie w przypadku metod czysto wirtualnych (które nie posiadają implementacji).

Sztuczka jest być może pomysłowa, ale jednocześnie dość przygnębiająca. Dlaczego bowiem tak prosta sprawa jak zapobieganie pomyłkom przy nadpisywaniu metod wirtualnych musi być w C++ realizowana za pomocą brzydkich makr?…

Tags: , ,
Author: Xion, posted under Programming »


9 comments for post “Metody wirtualne i override”.
  1. SirMike:
    August 29th, 2008 o 16:58

    Nie trzeba daleko szukac – wystarczy spojrzec na naglowki DirectX-a. Potrzeba matka wynalazkow.

  2. I:
    August 29th, 2008 o 19:07

    “Dlaczego bowiem tak prosta sprawa jak zapobieganie pomyłkom przy nadpisywaniu metod wirtualnych musi być w C++ realizowana za pomocą brzydkich makr?…”
    bo C++ “smierdzi”, zawsze tak bylo :< szkoda… Nowa wersja tez prawdopodobnie nie zmieni znaczaco stanu rzeczy.

  3. krajek:
    August 29th, 2008 o 19:15

    Po prostu : C++ nie jest dla idiotów ;).

  4. RedHot:
    August 29th, 2008 o 21:30

    Zgadzam się z krajkiem. C++ pod kątem wrażliwość na typy i tak się znacząco różni od C, a ludziom ciągle mało :/

  5. Developer:
    August 30th, 2008 o 21:09

    @I:
    Wcale nie śmierdzi, jest po prostu skomplikowany, ale w zamian daje duużo możliwości. ;)

    @krajek:
    @RedHot:
    What?! To może programujcie wszystko w asemblerze albo w kodzie binarnym… Strasznie głupim argumentem jest, że język jest trudny, bo używają go mądrzy ludzie. Każdy popełnia błędy, a nowoczesny język i jego kompilator powinny maksymalnie przed tymi błędami chronić. Żyjemy w czasach, w których liczy się szybkość dostarczania produktu. Trudny język nie przyspiesza czasu implementacji… :)

  6. Developer:
    August 30th, 2008 o 21:10

    Sorki za błąd, miało być “Żyjemy w czasach, w których liczy się czas, w którym dostarcza się produkt. Trudny język nie skraca czasu implementacji… :)”

  7. krajek:
    August 30th, 2008 o 22:04

    Nie do końca o to mi chodziło ;). Po pierwsze moją pierwszą wypowiedź należy traktować pół-żartem pół-serio. Część serio : to, że da się popełnić błąd, nie znaczy, że język jest zły. Ale od tego mamy głowę na karku, żeby problemów unikać np. przez ciągłe stosowanie tzw. dobrych praktyk pisania kodu . ;)

  8. Developer:
    August 31st, 2008 o 12:47

    @krajek:
    Rozumiem. Bardziej odniosłem się do Twojej i RedHot-a wypowiedzi jako do całości. Masz rację, od tego ma się głowę, żeby błędów nie popełniać. Z drugiej strony, można poddawać pod krytykę język, który na wiele błędów pozwala. No ale co tam, zobaczymy co przyniesie C++0x. ;)

  9. vashpan:
    September 1st, 2008 o 23:00

    @temat notki: I dlatego nie jestem zwolennikiem keywordowego minimalizmu, jaki IMO zastosowany jest w C++. Dlaczego nie ma w C++ tak banalnych do implementacji rzeczy jak wlasnie “override”, interfejsow, “sealed”, “abstract”, “finally”, “delegate”… I mozna by dlugo wymieniac rzeczy ktore wcale nie wymagaja poteznych zmian w architekturze jezyka, nie lamia zadnej kompatybilnosci z C, a znaczaco ulatwiliby prace. C++ nie pozjadal wszystkich rozumow zeby nie korzystac z pomyslow rodem z Javy czy C#… Pewnie ze C++ jest na tyle potezny ze wiekszosc z tych mechanizmow mozna sobie zrobic, ale “ladne” to nie jest… Po co sobie utrudniac skoro mozna prosciej ? Jezyk D ma takie same (albo nawet wieksze ) mozliwosci jak C++ dla programisty, a uproszczona skladnia i rozne “featursy” powoduja ze pisze sie prosciej. Nawet “pro” to powinien docenic… :)

Comments are disabled.
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.