2013-03-07 13 views
7

Ho il seguente problema: Ho un set di motori che automaticamente (ascoltando gli eventi) controlla il mio modello. La figura seguente mostra, in generale, il diagramma delle classi: Class DiagrammIdentificare le implementazioni della classe base in un array

Ora ho un cliente che conosce l'EngineFacade e voglio impostare la proprietà attiva dal Engine2 dal client, ma né il cliente né l'EngineFacade sa quale delle tre motori è Engine2.

Ci sono due modi, ma non mi piace nessuno di loro:

  1. Verificare se uno dei motori è di tipo Engine2 - se v'è un'altra classe che fa la stessa operazione, ma è denominata diverso Ho per cambiarlo in EngineBuilder E in EngineFacade.
  2. Verificare con una stringa identificatore - Non mi piacciono molto le stringhe magiche.

Quello che so sul sito del cliente è che c'è o dovrebbe essere un motore che gestisce la griglia. Ma non so di più.

Forse dovrei scegliere tra i due diavoli, ma forse uno di voi ha una soluzione migliore.

+1

Se è necessario identificare ogni motore separatamente, l'opzione semplice è assegnargli un identificativo univoco. Un altro modo per farlo è avere una proprietà name sul motore di base. Ogni motore implementa la proprietà name e quindi attiva un evento e quindi esamina il parametro del mittente. –

+3

Forse dovresti esaminare l'astrazione fornita dalla facciata. Sembra che tu abbia delle perdite. –

+0

Si potrebbe voler includere il client, i suoi metodi e le sue variabili nel diagramma, o pubblicare un codice che ne illustri l'utilizzo. –

risposta

1

Si potrebbe utilizzare un attributo sull'attuazione della Engine2, in questo modo:

[AttributeUsage(AttributeTargets.Class)] 
public class HandlesGridAttribute : Attribute { } 

che poi applica alla vostra derivazione:

[HandlesGrid] 
public Engine2 : EngineBase { ... } 

Poi, nel vostro client, verificare per l'attributo :

IEnumerable<EngineBase> bases = ...; 

// Get all the implementations which handle the grid. 
IEnumerable<EngineBase> handlesGrid = bases. 
    Where(b => b.GetType(). 
     GetCustomAttributes(typeof(HandlesGridAttribute), true).Any()); 

// Set the active property. 
foreach (EngineBase b in handlesGrid) b.Active = true; 

Lo svantaggio principale qui (che può o non può essere applicato a voi u) è che non è possibile modificare il valore in fase di esecuzione (poiché l'attributo viene elaborato al momento della compilazione). Se il tuo motore non è dinamico in questo modo, allora l'attributo è la strada giusta da percorrere.

Se è necessario modificare anche se una derivazione può eseguire questa azione in fase di esecuzione, è necessario ricorrere alla seconda opzione, costrutti di codice che identificano gli attributi del motore. Intendiamoci, non deve essere una stringa (e non mi piace neanche), ma può essere qualcosa di più strutturato che ti darà le informazioni che stai cercando.

+0

Thx, questo era quello che stavo cercando. Devo solo verificare quanto questo sia performante. – Yggdrasil

+0

Sembra che non sia così costoso. Solo nel caso in cui cach questo motore dove lo uso. – Yggdrasil

Problemi correlati