Possibili motivi di progettazione per la funzione di base con possibili aggiunte

0

Ho varie interfacce che devo implementare. Supponiamo ITypeA, ITypeB. Hanno i seguenti metodi:

ITypeA
  Connect
  Disconnect
  GetData
  SetData
  ClearData

ITypeB
  Connect
  Disconnect
  GetData
  SetData
  Start
  Pause
  Stop

Hanno alcune funzionalità di base: Connect , Disconnect , GetData e SetData . Se voglio aggiungere ITypeC in futuro, avrà anche queste funzionalità di base.

Voglio accedere alle funzionalità di base e se c'è una funzionalità aggiuntiva, voglio ottenere anche questo. Quali modelli di design sono disponibili che sono in grado di queste situazioni?

Ne ho trovato uno qui: Interfaccia di estensione . In questo, si crea un'interfaccia di base e più interfacce di estensione che implementano le funzioni aggiuntive. Nell'interfaccia di base è possibile chiedere le interfacce di estensione disponibili del componente. Ma questo approccio sembra complicato: devo creare interfacce per ogni tipo, fabbriche per le interfacce, ho bisogno di alcune tabelle per salvare ciò che Interface appartiene a quello Factory ...

Qual è la soluzione di base per questo problema? Interfacce di estensione? Ci sono altre alternative possibili per il mio problema?

    
posta fedab 01.09.2014 - 13:44
fonte

2 risposte

3

Potresti avere più gioia nel dividere le tue interfacce per comportamento e decidere i tipi più tardi.

interface IConnectable
    Connect
    Disconnect

interface IDataTransferrable
    GetData
    SetData

interface IPlayable
    Start
    Pause
    Stop


class TypeA : IConnectable, IDataTransferrable
class TypeB : IConnectable, IDataTransferrable, IPlayable

E allora come scoprire se il tuo oggetto supporta queste interfacce?

Ecco un modo:

if (ob is IPlayable)
{
    Playback(ob);
}

dove hai una funzione:

void Playback(IPlayable ob)
    
risposta data 01.09.2014 - 17:32
fonte
0

Potrei essere io ma non riesco a vedere la differenza tra il tuo problema e la descrizione del concetto di ereditarietà che funziona con le interfacce nello stesso modo in cui funziona con la classe.

Quindi la soluzione di base a questo problema sembra essere l'ereditarietà (un'interfaccia essendo di fatto una classe puramente astratta senza alcuna implementazione o attributo di metodo).

Se il tuo problema è che vuoi definire un'interfaccia su cui puoi chiamare potenziali metodi aggiuntivi non definiti al momento della compilazione, allora stai cercando una digitazione dinamica che è una funzione linguistica. (per scopi di ricerca guarda anche per il termine "anatra")

Guarda Ruby, Python o Perl per esempio.

    
risposta data 01.09.2014 - 17:01
fonte

Leggi altre domande sui tag