Zamiana obiektu klasy rodzica na obiekt klasy dziecka

Witam.

W ramach szybkiego wyjaśnienia: mówiąc rodzic/dziecko mam na myśli oczywiście kwestię dziedziczenia
class Dziecko < Rodzic

A teraz o co chodzi: tworzę grę działającą w trybie real-time w czystym Rubym, współpracującą z klientem w przeglądarce, w związku z tym musiałem napisać klasę do obsługi mechanizmu WebSocket.

A więc napisałem to jako zupełnie osobą i samodzielną klasę, która posiada także klasy pomocnicze - oprócz klasy Socket (stanowiącej trzon komunikacji przez socket) istnieje też klasa Client (która trzyma informacje o kliencie, takie jak jego unikalne ID lub aktualny ping, a także posiada funkcje do mierzenia pingu itd.). Klasa Socket zwraca obiekt Client w momencie podłączenia się nowego klienta.

Teraz oddzielnie piszę grę i opieram ją na tym module. W grze istnieje klasa Player, która dziedziczy po Client (każdy gracz jest klientem). Tylko w tym momencie trafiam na pewien problem - od klasy Socket posiadam obiekt klasy Client, który chciałbym rozszerzyć o dodatkowe funkcje związane z konkretnym graczem.

W najprostszym przypadku musiałbym wewnątrz klasy Socket zwracać obiekty klasy Player (dziedziczącej po Client), ale przecież nie będę modyfikował de facto w tym momencie zewnętrznej biblioteki.

Zastanawiałem się w związku z tym, czy istnieje sposób na scalenie pustego obiektu “Player < Client” z działającym już obiektem “Client”.

Nie prościej będzie rozdzielić komunikacje z logiką gracza? i zrobić np
player = Player.new(client) ?

I zrobić wewnątrz Playera metody do komunikacji za pomocą klienta? Ewentualnie… Ale przyszło mi parę innych pomysłów do głowy :stuck_out_tongue:

Ostatecznie nadpisałem klasę biblioteki, żeby mi zwracała obiekt klasy Player < Client i w sumie to rozwiązało problem.

Rozwiązanie od radwo jest bardzo dobre - nie musisz wewnątrz Playera pisać metod do komunikacji. Player wewnątrz będzie trzymał sobie obiekt client i możesz z niego dowolnie korzystać do komunikacji. Alternatywnie Player może być modułem zamiast klasą i możesz rozrzeszyć obiekt klienta (client = Client.new; client.extend(Player)) - wtedy ten konkretny obiekt client (a nie cała klasa) dostanie metody playera.