Wskaznik na obiekt a dodatkowe metody

0

Witam,

piszę kod w c++ i mam mały problem:
mam klasę abstrakcyjna A1, która ma metody takie jak metoda1,metoda2. Mam klasę B1, która dziedziczy klasę A1.

Aby posługiwać się klasą B1 używam wskażnika do klasy A1.

Teraz:
mam dodatkowe metody w B1, takie jak metoda3, metoda4. W jaki sposób wywował te medoty za pomocą powyższego
wskaźnika? Użyć np. dekoratora? Jakieś pomysły?

Z góry dzięki za sugestie.

1

dynamic_cast na B1 *

1

Na początek zastanów się czy to co robisz ma sens, bo zazwyczaj konieczność rzutowania w dół hierarchii oznacza, że coś nie gra na poziomie projektowania. Np. to zdanie brzmi podejrzanie

Aby posługiwać się klasą B1 używam wskażnika do klasy A1.
Skoro chcesz używać klasy B1 z metodami tylko dostępnymi dla niej, to dlaczego używasz wskaźnika do klasy bazowej?

0

robię tak ponieważ chce zachować jakiś wspólny interfejs(A1) dla wszystkich metod i łatwiej jest mi się posługiwać wskaźnikiem niż wskaźnikami odpowiednio (B1,B2,...). Czasem przydaje mi się wywołać jakąś metodę w dół.

1

Trudno mi powiedzieć bez znajomości całego projektu, ale brzmi jakbyś zamiast modelować prawdziwe relacje między klasami, wrzucił im jednego sztucznego przodka, bo "tak łatwiej".

0

Wygląda to tak/pseudokod ( pisany z ręki) :

class Figure(){
    makeMove();
    sayWhoIAm();
    ~Figure();
}

klasa która dziedziczy:

class King : Figure(){
    makeMove();
    sayWhoIAm();
    isCheck();
    ~Figure();
}

Jest w tym logika, tylko tak jak piszę, łatwiej operować na wsaźniku ogólnym niż szczegółowym a jednocześnie są przypadki, gdy chce mieć więcej informacji dlatego pomyśalałem o jakiś wzorcach :)

2

Czyli z jednej strony chcesz operować na typie bardziej ogólnym, z drugiej strony chcesz wywoływać funkcję w typie dziedziczącym. Nie uważasz że coś tu nie gra?

2

No tak, tylko że funkcja która operuje na Figure* nie powinna wiedzieć o istnieniu metody isCheck(), a ta która tego wymaga powinna operować na King*.

0

i dlatego w związku z tym jak to rozwiązać? tak, aby zachować elastyczność a z drugiej strony mieć czasem dostęp do metod nieoczywistych - to jest moje pytanie od początku

2

Uniwersalnego rozwiązania nie ma, musisz po prostu przemyśleć swoją hierarchię klas i zaprojektować metody tak, by dostawały to czego pragną.
Np. operowanie na wskaźniku do klasy bazowej jest fajne gdy możesz korzystać z polimorfizmu, czyli klasa bazowa ma odpowiednią metodę do wywołania. Jeśli nie ma to po co? Dlaczego w takim razie nie operować na void*, skoro jest najogólniejszy?

1
  1. @mattdj na oko to jest zwyczajnie zwalony design aplikacji jeśli musisz takie rzeczy robić.
  2. W przykładzie który podałeś to juz w ogóle, bo to nie król powinien sprawdzać czy jest szachowany, bo "szach" jest własnością całej planszy a nie króla jako takiego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1