Java Polimorfismo: Figuras Planas, Herança e Classes Abstratas

Computer science4.71 KB

Figuras Planas em Java: Herança e Polimorfismo

Este exemplo demonstra o uso de herança, polimorfismo e vinculação dinâmica em Java, por meio de uma hierarquia de classes de figuras planas.

Classe Base: FiguraPlana

class FiguraPlana {
    double area() {
        return 0;
    } // será corrigido com Classes Abstratas

    double perimetro() {
        return 0;
    }

    void mostrarDados() {
        System.out.println("\nNome do Objeto: " + this.toString());
        System.out.println("\nÁrea = " + this.area());
        System.out.println("\nPerímetro = " + this.perimetro());
    }
}

Classe Retangulo

class Retangulo extends FiguraPlana {
    private float ladoA;
    private float ladoB;

    public Retangulo(float ladoA, float ladoB) {
        this.ladoA = ladoA;
        this.ladoB = ladoB;
    }

    public float getLadoA() {
        return this.ladoA;
    }

    public void setLadoA(float ladoA) {
        this.ladoA = ladoA;
    }

    public float getLadoB() {
        return this.ladoB;
    }

    public void setLadoB(float ladoB) {
        this.ladoB = ladoB;
    }

    @Override
    double area() {
        return this.ladoA * this.ladoB;
    }

    @Override
    double perimetro() {
        return 2 * (this.ladoA + this.ladoB);
    }

    @Override
    void mostrarDados() {
        System.out.println("Retângulo com lados " + this.ladoA + " e " + this.ladoB);
        super.mostrarDados();
    }
}

Classe Circulo

class Circulo extends FiguraPlana {
    private float raio;

    public Circulo(float raio) {
        this.raio = raio;
    }

    public void setRaio(float raio) {
        this.raio = raio;
    }

    public float getRaio() {
        return this.raio;
    }

    // Método exclusivo
    float diametro() {
        return this.raio * 2f;
    }

    @Override
    double area() {
        return Math.PI * Math.pow(this.raio, 2);
    }

    @Override
    double perimetro() {
        return this.comprimento();
    }

    // Método exclusivo
    double comprimento() {
        return 2 * Math.PI * this.raio;
    }

    // Método exclusivo: área em função do comprimento (em PI)
    double area(float comprimento) {
        float raio; 
        raio = comprimento / 2;
        return Math.pow(raio, 2);
    }

    @Override
    void mostrarDados() {
        System.out.println("\nInformações do círculo de raio " + this.raio);
        super.mostrarDados();
        System.out.println("\nDiâmetro = " + this.diametro());
    }
}

Classe de Teste: LerFiguraPlana

class LerFiguraPlana {
    public static char lerTipo() throws Exception {
        char tipo;
        do {
            System.out.print("\nInforme 'R' para Retângulo, 'C' para Círculo ou 'F' para Fim -> ");
            tipo = JUtil.readChar();
        } while ((tipo != 'R') && (tipo != 'C') && (tipo != 'F'));
        return tipo;
    }

    public static void main(String[] args) throws Exception {
        FiguraPlana fp = new FiguraPlana(); // Resolver com Classe Abstrata
        // fp é uma variável polimórfica:
        // fp é um ator que pode assumir o papel de Círculo ou Retângulo
        char tipo; // Retângulo ou Círculo

        System.out.println("Dados da Figura Plana");
        tipo = lerTipo();
        while (tipo != 'F') {
            switch (tipo) {
                case 'R': {
                    fp = new Retangulo(0, 0);
                    System.out.print("\nInforme a base -> ");
                    ((Retangulo) fp).setLadoA(JUtil.readFloat()); // cast
                    System.out.print("\nInforme a largura -> ");
                    ((Retangulo) fp).setLadoB(JUtil.readFloat());
                    break;
                }
                case 'C': {
                    fp = new Circulo(0);
                    System.out.print("\nInforme o raio -> ");
                    ((Circulo) fp).setRaio(JUtil.readFloat());
                    break;
                }
            } // switch

            fp.mostrarDados(); // polimorfismo e vinculação dinâmica aqui

            System.out.print("\nÁrea NOVAMENTE = " + fp.area());

            // System.out.print("\nDiâmetro = " + ((Circulo) fp).diametro());

            // fp é uma instância de Círculo?
            if (fp instanceof Circulo) {
                System.out.println("\nDiâmetro " + ((Circulo) fp).diametro());
            }

            if (fp instanceof Circulo) {
                System.out.println("\nÁrea em PI do círculo com comprimento 20 PI " + ((Circulo) fp).area(20));
            }

            tipo = lerTipo();
        } // while
    } // main
} // class

Download

PDF Word HTML