Pattern per sovraccarico di sottoclasse con argomenti diversi

2

Sto scrivendo un server socket e host server bidirezionale, asincrono. La classe di gestore di base su cui sto lavorando è la seguente:

class BaseAsyncSocketHandler:
    async def send(self, data: bytes) -> int

Tuttavia, voglio scrivere una sottoclasse che manda due argomenti, un evento e dati arbitrari corrispondenti, che suggerisce la firma:

   async def send(self, event: str, data: object) -> int:
       return await super().send(event_data_magic_to_bytes(event, data))

Sfortunatamente, questo viola il principio di sostituzione di Liskov, e non penso che scriverlo come un mixin migliorerà la situazione, quindi spero che qualcuno abbia già visto questo o possa pensare ad un modello di design migliore ( o dimmi che questa è un'astrazione superflua in primo luogo.

    
posta noahbkim 13.04.2017 - 05:14
fonte

1 risposta

2

Alla fine, ho deciso di fornire quanto segue:

class BaseAsyncSocketHandler:

    async def _send(self, data: bytes) -> int:
        ...

    @abc.abstractmethod
    async def send(self, *args, **kwargs) -> int:
        pass

In questo modo l'utente può implementare sottoinsiemi del metodo send mentre usa il metodo base send fornito dal wrapper socket. Per quanto riguarda il motivo per cui ho voluto utilizzare send invece di creare un altro metodo di classe come send_event , penso che in genere volevo che l'interfaccia della classe rimanesse compatta e utilizzabile pur consentendo diverse metodologie socket.

    
risposta data 14.04.2017 - 01:17
fonte