2010-07-05 20 views
16

He decidido empezar a hacer pequeños proyectos de codificación por mi cuenta que se centran en la calidad del código en vez de cantidad de código y si tiene alguna pregunta acerca del uso de clases abstractas.ventajas de usar un clases abstractas vs. clase regular

Ahora conozco las diferencias entre las clases abstractas y las interfaces con la más grande (creo) siendo esa interfaz que permite definir solo los métodos que necesitan implementarse mediante clases utilizando la interfaz y clases abstractas que le permiten definir ambos métodos y miembros junto con la implementación del método predeterminado si así lo desea. Mi pregunta es ¿cuál es el principal beneficio de utilizar una clase abstracta frente a una clase normal? La única diferencia real entre los dos que puedo pensar es que no puedes crear una instancia de una clase abstracta. ¿Hay alguna otra diferencia entre los dos?

+7

¿Serán los downvoters por qué responden negativamente?!?! – apollodude217

Respuesta

14

estrictamente desde una perspectiva de diseño, lo mejor es simplificar las cosas. Creo que la mejor manera de simplificar las cosas es usar una simple analogía. Vamos a usar una analogía de las aves ...

Interfaz: utilice esta opción cuando desee hacer cumplir ciertas funciones que necesitan ser definidos. p.ej. IBird tiene un contrato para ScreamLikeABird y Fly (funciones de interfaz). Pero puede ser más específico y tener un IOstrich que tenga un contrato de ejecución. También puede tener un IHawk que tenga un contrato de ataque ... etc.

Resumen: utilice esta opción cuando desee hacer cumplir funciones de base y tienen propiedades básicas. p.ej. Avian podría ser una clase base para las aves que pueden tener una función llamada LayEgg, así como las especies llamadas Age, Species, NumberOfChicks ... etc. Estas cosas no/no deberían cambiar el comportamiento de un pájaro, ya que todas las aves ponen huevos ... etc. Pero no todas las aves suenan igual cuando grita o vuela de la misma manera (algunas ni siquiera vuelan) ... etc ... por lo tanto, deberían implementarse a través de una interfaz (s).

+26

-1 para analogías animales confusas y poco prácticas. –

+6

La analogía animal poco práctica se usó para ayudar a aliviar la confusión de "interfaz versus abstracto". Por cierto, ¿qué tan poco práctico es la interpretación de Hello World? La practicidad no tiene nada que ver con eso. Además, puedo ver que esta analogía es extremadamente práctica en muchas aplicaciones y/o juegos. – AlvinfromDiaspar

+0

@AlvinfromDiaspar +1 Bueno, creo que es la explicación más simple del mundo – Rohit

-2

Las clases abstractas se pueden usar para almacenar métodos en una "biblioteca" basada en OOP; dado que la clase no necesita ser instanciada, y tendría poco sentido, mantener métodos estáticos comunes dentro de una clase abstracta es una práctica común.

+0

"En Java, también puede declarar la clase como definitiva, por lo que no se puede extender". No, no puedes. 'abstract' +' final' no está permitido. Si su clase está destinada únicamente para métodos de utilidad estáticos, probablemente debería ser una clase final con un constructor privado (sin usar). –

+0

@Matthew Flaschen: Punto tomado. Gracias por la aclaración. – amphetamachine

+1

Los métodos estáticos no son la razón principal de las clases abstractas. – apollodude217

8

Además de no poder crear instancias de clases abstractas, algunos lenguajes pueden admitir tener métodos abstractos en clases abstractas: similar a las interfaces, un método abstracto deberá ser implementado por la clase que hereda de la clase abstracta.

El principal beneficio de las clases abstractas en mi opinión es que si hay algo de código que tiene que ser compartida entre las clases del mismo tipo. Por lo general, puede utilizar una interfaz para esto, pero a veces la funcionalidad de dichas clases puede superponerse y terminar con la duplicación de código. En este caso, puede usar una clase abstracta y simplemente colocar el código allí.

+3

+1 para una respuesta correcta y corta. – apollodude217

+0

Incluso si una clase no tiene ningún miembro abstracto y las instancias creadas tienen un comportamiento bien definido, puede ser sensato definir la clase como abstracta si no contiene nada que distinga instancias entre sí. Por ejemplo, se podría definir una clase base 'ImmutableList 'con subclases para' ArrayBackedImmutableList ',' ComputedImmutableList ',' LazyImmutableList ', etc. Si bien es posible que las instancias de clase base se comporten como un elemento cero En la lista, sería más limpio definir una clase concreta de 'EmptyImmutableList ' para tal fin. – supercat

-1

Esto podría ayudarle, vamos a considerar viajero que puede utilizar cualquier tipo de vehículo, es decir, ciclo, bicicleta, etc ...
pero todos los vehículos se mueve de la misma manera con diferentes limitaciones de velocidad para que podamos tener una

abstract class Avehicle  
{ 
     string fuel; 
     public void move() 
{ 
sysout("moving"); 
} 
} 

pero todos los vehículos sistema de ruptura es diferente

interface Ivehicle  
{ 

     public void breakorstop(); 
} 
class Traveler  
{ 
    Ivehicle v; 
//Settrers and getters 
public drive() 
{ 
v.move(); 
} 
public break() 
{ 
v.breakorstop(); 
} 
} 

Así que finalmente coche o clases de ciclo o en bicicleta pueden extender avehicle y puede implementar Vehicl Interfaz

6

En el mundo OO e, clases abstractas utiliza para imponer algunas restricciones de aplicación en el diseño &. Nada mas. Nunca tiene que usar clases abstractas en ningún caso. Pero puede haber casos en los que sea mejor imponer esas restricciones. Entonces, ¿qué son ellos?Veamos comparando sus oo-contrapartes.

Las clases abstractas vs interfaces de

Como saben, estos son dos de los conceptos principales de la herencia.

Básicamente, la interfaz se usa solo para declarar que está dispuesto a heredar el servicio subyacente y eso es todo. No contiene implementación & no tiene ninguna funcionalidad. En ese sentido, la interfaz es abstracta. Es por eso que es más una restricción de diseño que una restricción de implementación. Piense en una toma de auriculares en un altavoz. Cada auricular necesita implementar la interfaz jack (con los métodos start, stop, listen, turndown, turnup). Cada auricular debe anular esta interfaz para heredar la funcionalidad que el altavoz proporciona e implementar en consecuencia.

Las clases abstractas, por otro lado, pueden incluir métodos con una implementación. Esa es la diferencia básica y, en ese sentido, puede utilizar reutilizar más que una interfaz. Además, pueden contener campos privados no protegidos & que no se pueden utilizar a través de interfaces. Puede obligar a las subclases a implementar algunas funcionalidades imprescindibles con métodos abstractos (aquellos sin implementaciones). Clases abstractas más ágiles que interfaces.

Por supuesto, sin mencionar, solo puede extender una clase en Java en donde puede implementar la cantidad de interfaces.

Las clases abstractas vs clases regulares

¿Por qué no utilizar las clases regulares a continuación. ¿Cuál es el beneficio de usar una clase abstracta? Esto es bastante simple. Si usa clases abstractas, fuerza la funcionalidad central a ser implementada por los hermanos. Como desarrollador, no necesita recordar que debe implementar las funciones esenciales. Aquí es donde las clases abstractas imponen restricciones de diseño sobre las clases regulares. Además, al hacer que la clase sea abstracta evitas que la clase (incompleta) se cree accidentalmente.

+0

Por ** hermanos ** quiere decir hijo, teniendo en cuenta que el resumen se heredará en una clase que lo convierte en padre. Correcto ? –

+0

@DaniyalNasir sí. – zgulser

0

clases abstractas vs clases regulares vs interfaz. La clase abstracta generalmente apoya una idea de la generalización y contribuye de los programadores a mantener una pequeña disimulación cerebral mediante el diseño de proyectos multianuales debido a que cuando incluyen métodos abstractos tienen que describir una implementación de métodos abstractos en clases subordinadas, sin embargo, esta característica es una desventaja para proyectos de corta duración cuando un desarrollador tiene un zeitnot.

0

La única razón para declarar una clase como abstracta es para que no se pueda crear una instancia. Hay situaciones en las que tendrá una funcionalidad común que se comparte entre varias clases, pero por sí sola esa funcionalidad común no representa un objeto o representa un objeto incompleto. En ese caso, define la funcionalidad común como abstracta para que no pueda ser instanciada.

+0

¿Qué pasa ??? –

1

en mi opinión las clases abstractas tienen más uso en proyectos reales que en libros. algunas veces los gerentes de proyecto solo proporcionan la declaración de métodos y usted tiene que escribir el código para los métodos sin modificar la sintaxis central proporcionada por el administrador. así es como una clase abstracta es uso completo. en el método de clase simple define, declara y codifica en el mismo tiempo, pero no en clases abstractas. por ejemplo: -

abstract class Test 
{ 
    abstract void show();//method provided 
} 
class Child extends Test 
{ 
    void show()//coding 
    { 
     System.out.println("saurav"); 
    } 
} 
class main 
{ 
    public static void main(String[] args) 
    { 
    Test c = new Child(); 
    c.show(); 
    } 
} 
Cuestiones relacionadas