actionscript-3 - tienen - qué diferencia hay entre clases abstractas e interfaces
¿Cómo se decide entre usar una clase abstracta y una interfaz? (3)
Duplicado : interfaz vs clase Base
He estado profundizando en el mundo de OOP, patrones de diseño y actionscript 3 y todavía tengo curiosidad por saber cuándo usar una clase abstracta (pseudo para AS3 que 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
Como señala @ m4bwav, la principal diferencia 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.
Aunque creo que es un dilema falso. 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 eliges tener una implementación alternativa, usar la interfaz permitiría esto, mientras que si solo tuvieras la clase abstracta, tendrías que refactorizar para agregar la interfaz más adelante.
La única situación en la que puedo ver que no sería deseable proporcionar una interfaz en una situación así es cuando desea restringirlo para que solo se pueda usar su implementación. 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.
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.
Use una clase abstracta si tiene alguna funcionalidad que quiera que tengan sus subclases. Por ejemplo, si tiene un conjunto de funciones que quiere que tengan todas las subclases de la clase abstracta de base.
Use una interfaz si solo desea un contrato general sobre 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 intenta crear una jerarquía de herencia de objetos específica, realmente no querrá intentar hacer eso solo con interfaces.
Además, 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 abstractas y las interfaces, no es realmente una situación de uno u otro. 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.