2011-05-15 25 views
21

Este es mi programa de prueba en Java. Quiero saber cuánto es más importante la clase abstracta aquí y por qué usamos la clase abstracta para esto.Cómo y cuándo usar una clase abstracta

¿Es obligatorio o es el mejor método? ¿si es así, cómo?

class Shape1 { 

int i=1; 
void draw(){ 
System.out.println("this is shape:"+i); 
} 
} 

class Shape2 { 

int i=4; 
void draw(){ 
System.out.println("this is shape2:"+i); 
} 
} 


class Shape { 

public static void main(String args[]) 
{ 
Shape1 s1 = new Shape1(); 
s1.draw(); 

Shape2 s2 = new Shape2(); 
s2.draw(); 
} 
} 
+2

Diría que su ejemplo apunta más al uso de una interfaz que a un resumen. Es uno de los ejemplos típicos para mostrar el uso de una interfaz: se pueden dibujar diferentes formas (cuadrado, círculo, etc.). – PeterMmm

Respuesta

0

Clase abstracta, como su nombre sugiere es abstracto.

La clase abstracta no habla sobre la parte de implementación. De hecho, ampliamos la clase abstracta para proporcionar la implementación de sus métodos abstractos. También puede tener métodos no abstractos.

Marque aquí: Use of Abstract Class in Java

EDIT:

Código de ejemplo:

abstract class Shapes { 

int i=1; 
abstract void draw(); 

// Remember : Non-abstract methods are also allowed 
void fill() { 
    System.out.println("Non abstract method - fill"); 
} 
} 

class Shape1 extends Shapes { 

int i=1; 
void draw(){ 
System.out.println("This is Shape 1:"+i); 
} 
} 

class Shape2 extends Shapes { 
    int i=2; 
    void draw() { 
     System.out.println("This is Shape 2:"+i); 
    } 
} 

class Shape { 

public static void main(String args[]) 
     { 
     Shape1 s1 = new Shape1(); 
     s1.draw();      // Prints This is Shape 1:1 

     Shape2 s2 = new Shape2(); 
     s2.draw();      // Prints This is Shape 2:2 
     } 
    } 
+0

Esto no es verdad. una clase abstacta puede tener toneladas de impelementaciones. También puede tener métodos abstractos que se apliquen a la clase extendida para implementar, pero ciertamente puede tener implementación.Las interfaces no tienen implementación, las clases abstractas pueden (sí, puedes tener una clase abstracta con solo métodos abstractos, pero no tiene que ser así). Por supuesto, no puede tener una instancia de una clase abstracta. – Nanne

+0

Sí, lo sé. Editado! –

4

Una clase abstracta tiene una relación "es-un" tipo de relación con sus subclases. Entonces, por ejemplo, podría tener una clase abstracta Shape que tiene cosas que cualquier forma tiene (como una función de dibujo), y luego una clase SquareShape. Cada forma cuadrada es una forma, pero no todas las formas son formas cuadradas.

En su ejemplo, tiene 2 tipos de formas y una clase que tiene 2 instancias de estos. Esa no es una relación que debas definir con abstract, creo.

Es posible que desee hacer algo con sus nombres, porque este es un ejemplo bastante pequeño, es difícil ver las implicaciones reales de los archivos y cómo deberían funcionar.

13

Aquí utilizará una clase o interfaz abstracta para crear una clase base/interfaz común que proporcione el método void draw(), p.

abstract class Shape() { 
    void draw(); 
} 

class Circle extends Shape { 
    void draw() { ... } 
} 

... 

Shape s = new Circle(); 
s.draw(); 

En general, utilizaría una interfaz. Sin embargo es posible utilizar una clase abstracta si:

  1. Necesita/desea proporcionar funcionalidad común o miembros de la clase (por ejemplo, el miembro int i en su caso).
  2. Sus métodos abstractos tienen cualquier otra cosa que no sea el acceso público (que es el único tipo de acceso permitido para las interfaces), p. en mi ejemplo, void draw() tendría visibilidad del paquete.
0

Una clase abstracta es una clase que tiene al menos un método no implementado o la palabra clave abstracta. Por ejemplo, un método abstracto puede tener este aspecto:

public abstract String myMethod(String input);

(Observe que el método termina con un punto y coma).

y una clase puede tener este aspecto:

public abstract class MyClass { 

    public abstract String myMethod(String input); 

    public String anotherMethod(String input) { 
     return intput + " additional text"; 
    } 
} 

Una clase abstracta no puede ser instanciada. Las clases abstractas requieren una subclase para implementar el comportamiento que falta para que pueda crearse una instancia.

El objetivo principal de una clase abstracta es proporcionar una implementación compartida del comportamiento común, promoviendo la reutilización del código.

En Java, se puede lograr el mismo efecto utilizando una composición de clases en lugar de herencia de clases abstractas ampliamente definidas. Esto permite más clases modulares, específicas de funciones que promueven la reutilización de códigos, que a su vez aumenta la capacidad de mantenimiento.

Mi consejo sería utilizar la clase abstracta solo cuando sea estrictamente necesario, y en particular evitar usarlo como una bolsa de truco llena de todo tipo de funcionalidades.

En Scala se usarían rasgos, que son una manera elegante de resolver esto. Sin embargo, requiere mucha atención para hacerlo bien.

+1

Las clases abstractas no necesitan necesariamente tener métodos abstractos ... podría definir una clase abstracta que tenga todos sus métodos implementados, por ejemplo. –

2

ejemplo de muestra para usar la clase abstracta en Java.

package use_of_abstract; 

abstract class Shapes 
{ 
    int i=1; 

    abstract void draw(); 
    abstract void color(String mycolor); 

    //not an abstract method 
    void fill() 
    { 
     System.out.println("Non-Abstract Method -> Fill"); 
    } 

    //not an abstract method 
    String anotherMethod(String input) 
    { 
     return input + " additional text"; 
    } 

} 

package use_of_abstract; 

public class Shape_One extends Shapes 
{ 
    int i=1; 

    @Override 
    void draw() 
    { 
     System.out.println("This is Shape One:"+i); 
    } 

    @Override 
    void color(String mycolor) 
    { 
     System.out.println("This is Shape One:"+mycolor); 

    } 

    @Override 
    String anotherMethod(String anotherMethod) 
    { 
     System.out.println("This is Shape One:"+anotherMethod); 
     return anotherMethod; 

    } 

} 

package use_of_abstract; 

public class Shape_Two extends Shapes 
{ 
    int i=2; 

    @Override 
    void draw() 
    { 
     System.out.println("This is Shape Two :"+i); 
    } 

    @Override 
    void color(String mycolor) 
    { 
     System.out.println("This is Shape Two Color:"+mycolor); 
    } 

    @Override 
    String anotherMethod(String anotherMethod) 
    { 
     System.out.println("This is Shape Two:"+anotherMethod); 
     return anotherMethod; 

    } 

} 

package use_of_abstract; 

import java.awt.Color; 

public class Shape_Main 
{ 

    public static void main(String args[]) 
    { 
     Shape_One s1; 
     Shape_Two s2; 

     s1=new Shape_One(); 
     s2= new Shape_Two(); 

     s1.draw(); 
     s2.draw(); 

     s1.fill(); 
     s2.fill(); 

     s1.color("Blue"); 
     s2.color("Green"); 


     s1.anotherMethod("HELLO..............Its Another Method 1"); 
     s2.anotherMethod("HELLO..............Its Another Method 2"); 


    } 
} 
32

clases abstractas son clases que contienen uno o más abstractas métodos. Un método abstracto es un método que se declara, pero no contiene ninguna implementación. Las clases abstractas no se pueden crear instancias y requieren subclases para proporcionar implementaciones para los métodos abstractos. Veamos un ejemplo de una clase abstracta y un método abstracto.

Supongamos que estamos modelando el comportamiento de los animales, al crear una jerarquía de clase que comenzó con una clase base llamada Animal. Los animales son capaces de hacer cosas diferentes, como volar, cavar y caminar, pero hay algunas operaciones comunes, así como comer y dormir. Algunas operaciones comunes son realizadas por todos los animales, pero de una manera diferente también. Cuando se realiza una operación de una manera diferente, es un buen candidato para un método abstracto (obligando a las subclases a proporcionar una implementación personalizada). Miremos una clase base Animal muy primitiva, que define un método abstracto para hacer un sonido (como el ladrido de un perro, el mugido de una vaca o el oinking de un cerdo).

public abstract class Animal 
{ 
    public void eat(Food food) 
    { 
     // do something with food.... 
    } 

    public void sleep(int hours) 
    { 
     try 
    { 
     // 1000 milliseconds * 60 seconds * 60 minutes * hours 
     Thread.sleep (1000 * 60 * 60 * hours); 
    } 
    catch (InterruptedException ie) { /* ignore */ } 
    } 

    public abstract void makeNoise(); 
} 

Tenga en cuenta que la palabra clave abstracta se utiliza para indicar tanto un método abstracto como una clase abstracta. Ahora, cualquier animal que quiera ser instanciado (como un perro o una vaca) debe implementar el método makeNoise; de ​​lo contrario, es imposible crear una instancia de esa clase. Veamos una subclase de Perro y Vaca que extiende la clase de Animal.

public Dog extends Animal 
{ 
    public void makeNoise() { System.out.println ("Bark! Bark!"); } 
} 

public Cow extends Animal 
{ 
    public void makeNoise() { System.out.println ("Moo! Moo!"); } 
} 

Ahora usted puede preguntarse por qué no declarar una clase abstracta como una interfaz, y tener el perro y la vaca implementa la interfaz. Claro que podrías, pero también necesitarías implementar los métodos de comer y dormir. Al usar clases abstractas, puede heredar la implementación de otros métodos (no abstractos). No puede hacer eso con las interfaces: una interfaz no puede proporcionar implementaciones de métodos.

+0

Michael Muchas gracias por esta información útil ... :) –

+0

Esta es una explicación perfecta. Muy fácil de entender y ayudarme a comprender el concepto. Muchas gracias. – Torched90

+0

¡Esta es una gran información! ¡Gracias! –

Cuestiones relacionadas