Se il polimorfismo è la capacità di diversi tipi di condividere la stessa interfaccia, esiste un nome per un singolo tipo che soddisfa diverse interfacce?

1

Considera questo esempio di polimorfismo. Ho due diverse API , IWrite e IRead e quindi una singola implementazione di queste.

interface IRead
{
    Entity Find(int id);
}

interface IWrite
{
   void Persist(Entity);
}

class SomeRDBMSRepository : IRead, IWrite
{
   public void Persist(Entity entity)
   {
      ...persist it
   }

   public Entity Find(int id)
   {
      ...return an entity
   }
}

Poiché l'implementazione ha tutti i dettagli su come implementare le interfacce, potremmo usare facilmente lo stesso tipo, SomeRDBMSRepository . Potremmo avere diversi client delle API, forse come questi:

 class FindUserQueryHandler
    {
        public FindUserQueryHandler(IRead readEntities)
        {
        }

        public User Handle(int id)
        {
            return _readEntities.Find(id);
        }
    }
class RegisterUserCommandHandler
{
    public RegisterUserCommandHandler(IWrite writeEntities)
    {
    }

    public void Handle(User user)
    {
        _writeEntities.Persist(user);
    }
}

Quando vogliamo sottolineare l'idea del polimorfismo, allora semplicemente creiamo nuovi tipi che forniscono funzionalità diverse. Diamo questo esempio quando abbiamo, diciamo, un requisito che gli utenti devono essere interrogati da un repository differente, quindi potremmo creare un nuovo tipo, SomeNoSQLRepository : IRead e in questo modo FindUserQueryHandler può usare un istanza di questa implementazione senza preoccuparsi dei suoi dettagli effettivi, purché il tipo implementa l'API IRead . Anche FindUserQueryHandler non deve fare nulla di speciale (cioè cambiare)

Qualcuno mi ha chiesto qualche tempo fa per un esempio di polimorfismo ( tosse / intervista) e gli ho dato l'esempio di SomeRDBMSRepository perché penso che questo tipo abbia ruoli o responsabilità diversi per diversi client. Per un tipo query è reader , mentre per il comando è writer . Quindi il mio motivo era questo tipo è poly perché ha il modulo IRead e il modulo IWrite nello stesso tempo. Sembra che mi sia sbagliato.

Mentre leggevo la definizione del polimorfismo da Wikipedia, potrei adattarla al significato che se potessimo usare qualsiasi tipo nel posto in cui ci si aspetta qualche API, finché quel tipo implementa l'API chiaramente definita, allora quel codice è polimorfico . I meccanici non sono davvero mater. C # o Java richiede di specificare che una classe implementa un'interfaccia, ma per un linguaggio come Go c'è abbastanza per essere una corrispondenza delle firme del metodo tra il tipo e l'interfaccia.

Wikipedia dice anche che un tipo polimorfico è un tipo che ha operazioni che possono accettare oggetti di diverso tipo. Nel mio esempio, i tipi di query e comandi sono tipi polimorfici secondo questa definizione.

Fondamentalmente la mia domanda è: c'è una tassonomia per SomeRDBMSRepository ? Quanto mi sbagliavo?

    
posta Adrian Iftode 22.01.2017 - 17:43
fonte

1 risposta

4

Prima di tutto, la tua definizione è sbagliata. Stai usando il termine tipo in modo errato. Ecco la tua definizione

polymorphism is the ability of different types to share the same interface

I tipi non hanno interfacce; le interfacce sono tipi. Il polimorfismo è infatti la capacità delle espressioni di assumere più tipi. In OOP, le espressioni sono oggetti e i tipi sono interfacce.

L'esempio che hai dato è corretto. Un oggetto di classe SomeRDBMSRepository ha in realtà tre tipi: SomeRDBMSRepository , IRead e IWrite , quindi è polimorfico (trimorfo?). Il tuo intervistatore ha sbagliato in questo caso, che sfortunatamente accade molto spesso nelle interviste tecnologiche.

    
risposta data 22.01.2017 - 18:13
fonte

Leggi altre domande sui tag