package com.trifulcas.liskov; public class DocumentNoLiskov { public String Content; // Implementa los dos métodos sin tener en cuenta // Que clases derivadas pueden no necesitarlos public void Read() { System.out.println(Content); } public void Write(String content) { Content = content; } }
package com.trifulcas.liskov; public class ReadOnlyDocumentNoLiskov extends DocumentNoLiskov { // Al derivar de document pero no implementar write // Tenemos que lanzar un error public void Write(String content) { throw new IllegalArgumentException("Cannot write to a read-only document."); } }
DocumentNoLiskov a = new DocumentNoLiskov(); ReadOnlyDocumentNoLiskov b = new ReadOnlyDocumentNoLiskov(); ArrayList<DocumentNoLiskov> lista = new ArrayList<>(); lista.add(a); lista.add(b); // No podemos usar Liskov porque ReadOnly no implementa escritura for (DocumentNoLiskov doc : lista) { doc.Write("Hola"); // Lanza un error en el documento de solo lectura }
package com.trifulcas.liskov; public interface Readable { public String read(); }
package com.trifulcas.liskov; public interface Writable { void write(String content); }
package com.trifulcas.liskov; public class EditableDocument implements Readable, Writable { private String content; @Override public void write(String content) { this.content = content; } @Override public String read() { return content; } }
package com.trifulcas.liskov; public class ReadOnlyDocument implements Readable { private String content; @Override public String read() { // TODO Auto-generated method stub return content; } }
EditableDocument e = new EditableDocument(); EditableDocument f = new EditableDocument(); ReadOnlyDocument g = new ReadOnlyDocument(); ReadOnlyDocument h = new ReadOnlyDocument(); ArrayList<Readable> leibles = new ArrayList<>(); ArrayList<Writable> editables = new ArrayList<>(); leibles.add(e); leibles.add(f); leibles.add(g); leibles.add(h); for (Readable doc : leibles) { doc.read(); } editables.add(e); editables.add(f); // No podemos añadir un documento que no se puede escribir // editables.add(g); for (Writable doc : editables) { doc.write("ww"); }