Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 13 su 13

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da shodan Visualizza il messaggio
    Si, perch� il dynamic_cast<> � abbastanza lento rispetto a una chiamata virtuale, per cui si pu� "emulare" tramite una enum, una funzione virtuale e uno static_cast<>. Ma non entro nei dettagli perch� non � l'oggetto del thread.
    e anche perche' un sistema del genere lo avevi gia' postato per altro, quindi ok.

    Quote Originariamente inviata da shodan Visualizza il messaggio
    La cosa pi� semplice � mettere in overload la funzione update() affinch� riceva il dato corretto.
    Ancora una volta sono stato poco chiaro io, o sto seguendo una strada sbagliata: intendevo che i subject da seguire erano due, ma per un determinato observer concreto, non in tutto il programma.

    Detto in altre parole: i Subject concreti da osservare sono di piu' tipi, piu' di tre, ma non sono piu' di due, max tre per observer concreto.

    Il tentativo fatto con setSubject in associazione a dynamic_cast, era per avere un metodo da reimplementare in base alle necessita' nelle classi concrete di observer, senza avere un sistema adatto al singolo caso specifico, spero di essermi spiegato questa volta.

    Anzi, aggiungo questo sperando di chiarire cosa avevo in testa.

    La classe Subject, cosi' come implementata era gia' di uso generale, nel senso che le classi concrete basta che siano derivate da essa, e possono gestire gli observer senza problemi (aggiunta, rimozione, comunicazione della distruzione del subject agli observer e quanto serve).

    Per la classe Observer, se il subject e' uno, anche li non ci sono problemi, la comunicazione col subject e' semplice: nell'observer concreto tengo il riferimento al subject concreto e dovrei essere a posto.

    Se l'observer deve osservare piu' subject, e devo accedere ai metodi specifici del tipo di subject concreto, allora nasce il tentativo della classe DerObserverMoreSubject.

    Interessante std::set: tra l'altro toglie il pensiero di controllare l'unicita' del dato passato, qualora questo sia un requisito.

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il tentativo fatto con setSubject in associazione a dynamic_cast, era per avere un metodo da reimplementare in base alle necessita' nelle classi concrete di observer, senza avere un sistema adatto al singolo caso specifico, spero di essermi spiegato questa volta.
    Si, ma se ci pensi bene la chiave di tutto è la funzione update(): è li che devi discriminare i vari tipi di subject che interessano all'observer, non da altre parti. Il resto è solo nebbia in val padana.
    Fermo restando l'ultimo codice che ti ho mostrato, è sufficiente modificare la update() in questo modo:
    codice:
    class DerObserverMoreSubject : public Observer {
    public:
    
        void update(Subject1* subject) override {
            auto sub = mSubjects.find(subject);
            // se il subject non è nel set non faccio niente.
            
            if (sub != m_Subjects.end()) { 
                // i subjects interessati sono quelli che ho deciso di osservare
                auto ptr1 = dynamic_cast<DerSubject1*>(subject);
                if (ptr1 != nullptr) {
                    // aggiorno l'observer con i dati di ptr2
                }
    
                auto ptr2 = dynamic_cast<DerSubject2*>(subject);
                if (ptr2 != nullptr) {
                    // aggiorno l'observer con i dati di ptr2
                }
    
                auto ptr3 = dynamic_cast<DerSubject3*>(subject);
                if (ptr3 != nullptr) {
                    // aggiorno l'observer con i dati di ptr3
                }
    
                // altri subjects non previsti sono ignorati.
    
            }
        }
    
    };
    Ovviamente ogni observer avrà la sua update() con i suoi subjects da discriminare e i subjects la loro notify() per la loro lista di observers. E il tutto funziona con N observers e M subjects. Qui ho usato dynamic_cast<>, che comunque non è così lento da farti prendere sonno , perché è più comodo, meno laborioso e più sicuro di enum più funzione virtuale.
    Interessante std::set: tra l'altro toglie il pensiero di controllare l'unicita' del dato passato, qualora questo sia un requisito.
    Oddio, se ci fosse un doppione dello stesso subject avresti due chiamate a update() di cui solo una ti serve per l'aggiornamento dell'observer, l'altra lo sovrascrive con gli stessi dati.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da shodan Visualizza il messaggio
    E il tutto funziona con N observers e M subjects.
    Beh, mi resta solo una cosa da dire: grazie!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.