2009-02-17 9 views
14

Duplicar: Interface vs Base class¿Cómo se decide entre usar una clase abstracta y una interfaz?


he estado recibiendo más profundamente en el mundo de la programación orientada a objetos, patrones de diseño, y ActionScript 3 y todavía estoy curioso cómo saber cuándo utilizar una clase abstracta (pseudo para AS3 cuales no admite clases abstractas) y una interfaz. Para mí ambos solo sirven como plantillas que aseguran que ciertos métodos se implementen en una clase determinada. ¿La diferencia radica únicamente en el hecho de que las clases abstractas requieren herencia y una interfaz simplemente se extiende?

Gracias, Brian Hodge hodgedev.com

+0

dupe: http://stackoverflow.com/questions/56867/interface-vs-base-class – juan

+1

es ligeramente diferente porque se refiere a las clases base abstractas, en lugar de a todas las clases base. –

+0

Quitaría el enlace duplicado, pero no tengo ese nivel de acceso –

Respuesta

30

utilizar una clase abstracta si tiene alguna funcionalidad que desea es subclases a tener. Por ejemplo, si tiene un conjunto de funciones que quiere que tengan todas las subclases de la clase abstracta de base.

Utilice una interfaz si solo desea un contrato general de comportamiento/funcionalidad. Si tiene una función u objeto que desea tomar en un conjunto de objetos diferentes, use una interfaz. Luego puede cambiar el objeto que se pasa, sin cambiar el método ni el objeto que lo está tomando.

Las interfaces suelen ser sueltas, en comparación con las clases abstractas. No querrá utilizar interfaces en una situación en la que escribe constantemente el mismo código para todos los métodos de la interfaz. Use una clase abstracta y defina cada método una vez.

Además, si está intentando crear una jerarquía de herencia de objetos específica, realmente no querría intentar hacer eso solo con interfaces.

También, de nuevo, en algunos idiomas solo puede tener una única clase base, y si un objeto ya tiene una clase base, tendrá que hacer algunas refactorizaciones para usar una clase base abstracta. Esto puede o no significar que quizás prefieras usar una interfaz.

Como señala @tvanfosson, no es una mala idea usar muchas interfaces, cuando realmente entiendes las clases y las interfaces abstractas, en realidad no es una situación cualquiera. Una situación particular podría usar tanto clases abstractas e interfaces como ninguna de las dos. Me gusta usar las interfaces a veces simplemente para restringir a qué puede acceder un método u objeto en un objeto de parámetro transferido.

+0

Muchas gracias, esto fue muy útil. –

+0

Esto va directo al grano, los pulgares arriba de mí – JPReddy

2

Las clases abstractas ofrecen la posibilidad de implementar métodos específicos y requieren que otros se implementen en la clase heredada. Con las interfaces, todo tiene que implementarse en la clase de implementación.

2

Como notas de @ m4bwav, la diferencia principal es que una clase abstracta puede, y a menudo lo hace, proporcionar una implementación predeterminada para al menos algunos métodos. Esto le permite usar la clase abstracta para mantener su código SECO (no se repita), manteniendo el código común a todas las clases que heredan de la clase abstracta en la misma clase abstracta.

Creo que es un dilema falso, sin embargo. No es necesario y posiblemente no debería elegir entre interfaces y clases abstractas. En la mayoría de los casos, le conviene definir la interfaz, luego haga que su clase abstracta proporcione una implementación de esqueleto predeterminada si se requiere/desea. Para mí, la pregunta sería ¿Necesito una interfaz o una interfaz y una clase abstracta en lugar de una interfaz o una clase abstracta? El uso de la interfaz desacopla su código de cualquier implementación particular, incluso su implementación de clase abstracta.Si debe elegir tener una implementación alternativa, usar la interfaz permitiría esto, mientras que si solo tuviera la clase abstracta, tendría que refactorizar para agregar la interfaz más adelante.

La única situación en la que puedo ver que proporcionar una interfaz en una situación así no sería deseable es cuando quiere restringirlo para que solo su implementación pueda ser utilizada. El uso de la clase abstracta y que ciertos métodos no sean virtuales implicaría el uso de su código en todas las circunstancias en que el implementador se derive de su clase.

Cuestiones relacionadas