2010-02-12 18 views

risposta

5

Solo perché non è possibile creare un'istanza di una classe particolare, non significa che non è possibile utilizzarlo. In questo scenario, il codice chiamante utilizza la classe base astratta come definizione del contratto in base al quale opera. In questo senso, ogni classe che deriva dalla classe base dovrebbe essere intercambiabile rispetto all'interfaccia definita dalla classe base, quindi sì, Liskov si applica ancora. In effetti, questo è uno dei motivi principali per cui si vorrebbe avere una classe base astratta per un insieme di classi che hanno un comportamento comune - quindi è possibile definire le operazioni in termini dell'interfaccia di classe base e non preoccuparsi di quale classe derivata quella in realtà stai operando.

1

Sì, perché un chiamante può sempre fare questo:

BaseAbstractClass instance = new DerivedClass(); 
0

Le classi astratte non sono affatto in conflitto con LSP. Molte persone considerano l'utilizzo di "nuovo" direttamente dal codice client per essere una violazione dello spirito di LSP. Se entrambi istanziate e utilizzate un oggetto, siete strettamente vincolati a tale implementazione e non potete assolutamente "sostituirlo".

Considerare di avere l'oggetto creato tramite una factory o passato come argomento o tramite dependency injection dopo essere stato creato da qualche tipo di repository che può essere focalizzato a prendere decisioni su quali tipi concreti sono necessari in varie circostanze.

0

In breve, sì. L'LSP si applica essenzialmente allo all'eredità pubblica. Il fatto che una classe base sia astratta non lo cambia. La classe base definisce un'interfaccia e tutti i derivati ​​legittimi devono soddisfare tutti i requisiti di tale interfaccia.

Problemi correlati