Classe astratta

di il
4 risposte

Classe astratta

Ho questo codice
interface Downloadable {
   public void download();
}

interface Readable extends Downloadable {
   public void readBook();
}

abstract class Book implements Readable {
   public void readBook() {
       System.out.println("Read Book");
   }
}

 class EBook extends Book {      <-------- QUA
    public void readBook() {
       System.out.println("Read E-Book");
   }
}

public class Pippo {
public static void main (String [] args) {
    Book book1 = new EBook();
    book1.readBook();
}
}
mi da l'errore in "QUA"
ed esattamente l'errore è questo "EBook is not abstract and does not override abstract method download() in Downloadable"
so che le classi astratte non possono essere instanziate ma oltre non ne so molto

4 Risposte

  • Re: Classe astratta

    maracaibo25 ha scritto:


    mi da l'errore in "QUA"
    ed esattamente l'errore è questo "EBook is not abstract and does not override abstract method download() in Downloadable"
    so che le classi astratte non possono essere instanziate ma oltre non ne so molto
    Partiamo da un aspetto: quando vedi la parola "abstract" devi pensare a qualcosa di incompleto, che quindi non può essere utilizzato direttamente. Le interfacce (salvo le novità di Java 8+) sono da vedere come astratte al 100%.

    Una classe astratta ha la principale caratteristica di non poter essere istanziata. Potrebbe essere ad esempio incompleta proprio a livello tecnico (dichiara o non implementa dei metodi astratti) e/o magari rappresenta un concetto molto ampio e appunto astratto e quindi non ha senso creare oggetti di questa classe.

    Se però fai una classe "concreta" (non abstract), ci si aspetta (e il compilatore si aspetta!) che sia tutto completo, concretizzato, cioè ci siano tutte le implementazioni dei metodi. La tua classe EBook è "concreta", non essendo abstract, ma NON implementa download(). Da qui l'errore.
  • Re: Classe astratta

    andbin ha scritto:



    Se però fai una classe "concreta" (non abstract), ci si aspetta (e il compilatore si aspetta!) che sia tutto completo, concretizzato, cioè ci siano tutte le implementazioni dei metodi. La tua classe EBook è "concreta", non essendo abstract, ma NON implementa download(). Da qui l'errore.
    ok grazie andbin ho risolto implementando download() nella classe EBook
  • Re: Classe astratta

    Scusami andbin in questo codice invece
    abstract class TwoDShape {  
      private double width;  
      private double height;  
      private String name;  
      
      // A default constructor.  
      TwoDShape() {  
        width = height = 0.0;  
        name = "null";  
      }  
      
      // Parameterized constructor.  
      TwoDShape(double w, double h, String n) {  
        width = w;  
        height = h;  
        name = n;  
      }  
      
      // Construct object with equal width and height.  
      TwoDShape(double x, String n) {           
        width = height = x;  
        name = n;  
      }  
      
      // Construct an object from an object.  
      TwoDShape(TwoDShape ob) {                 
        width = ob.width;  
        height = ob.height;  
        name = ob.name;  
      }  
      
      // Accessor methods for width and height.  
      double getWidth() { return width; }  
      double getHeight() { return height; }  
      void setWidth(double w) { width = w; }  
      void setHeight(double h) { height = h; }  
      
      String getName() { return name; }  
      
      void showDim() {  
        System.out.println("Width and height are " +  
                           width + " and " + height);  
      }  
      
      abstract double area();
    }  
      
    // A subclass of TwoDShape for triangles. 
    class Triangle extends TwoDShape {  
      private String style;  
        
      // A default constructor.  
      Triangle() {  
        super();  
        style = "null";  
      }  
      
      // Constructor for Triangle.  
      Triangle(String s, double w, double h) {  
        super(w, h, "triangle");  
      
        style = s;   
      }  
      
      // Construct an isosceles triangle.  
      Triangle(double x) {  
        super(x, "triangle"); // call superclass constructor  
      
        style = "isosceles";   
      }  
      
      // Construct an object from an object.  
      Triangle(Triangle ob) {  
        super(ob); // pass object to TwoDShape constructor  
        style = ob.style;  
      }  
      
      // Override area() for Triangle. 
      double area() {  
        return getWidth() * getHeight() / 2;  
      }  
      
      void showStyle() {  
        System.out.println("Triangle is " + style);  
      }  
    }  
      
    // A subclass of TwoDShape for rectangles.   
    class Rectangle extends TwoDShape {   
      // A default constructor.  
      Rectangle() {  
        super();  
      }  
      
      // Constructor for Rectangle.  
      Rectangle(double w, double h) {  
        super(w, h, "rectangle"); // call superclass constructor  
      }  
      
      // Construct a square.  
      Rectangle(double x) {  
        super(x, "rectangle"); // call superclass constructor  
      }  
      
      // Construct an object from an object.  
      Rectangle(Rectangle ob) {  
        super(ob); // pass object to TwoDShape constructor  
      }  
      
      boolean isSquare() {   
        if(getWidth() == getHeight()) return true;   
        return false;   
      }   
         
      // Override area() for Rectangle. 
      double area() {   
        return getWidth() * getHeight();   
      }   
    }  
      
    class AbsShapes {  
      public static void main(String args[]) {  
        TwoDShape shapes[] = new TwoDShape[4];  
      
        shapes[0] = new Triangle("right", 8.0, 12.0);  
        shapes[1] = new Rectangle(10.0);  
        shapes[2] = new Rectangle(10.0, 4.0);  
        shapes[3] = new Triangle(7.0);  
      
        for(int i=0; i < shapes.length; i++) {  
          System.out.println("object is " + shapes[i].getName());  
          System.out.println("Area is " + shapes[i].area());  
      
          System.out.println();    
        }  
      }  
    }
    essendo un array di oggetti di tipo TwoDShape (astratti) va bene l'implementazione perche poi i vari oggetti vengono inizializzati con le classi vere e proprie "new Triangle,new Rectangle" giusto?
  • Re: Classe astratta

    maracaibo25 ha scritto:


    essendo un array di oggetti di tipo TwoDShape (astratti) va bene l'implementazione perche poi i vari oggetti vengono inizializzati con le classi vere e proprie "new Triangle,new Rectangle" giusto?
    Sì, corretto. In un array TwoDShape[] puoi mettere oggetti (anche diversi) di qualunque classe che deriva da TwoDShape.
Devi accedere o registrarti per scrivere nel forum
4 risposte