Pregunta ¿Razones para no usar clase abstracta en lugar de interfaz?


Estoy considerando usar una clase abstracta con todos los miembros abstractos en lugar de una interfaz para evitar la implementación explícita de la interfaz del código de placa de calderas. Entonces, en lugar de

type IMyInterface =
    abstract Name : string
    abstract Text : string

type MyClass() =
    member __.Name = "name"
    member __.Text = "text"
    interface IMyInterface with
        member this.Name = this.Name
        member this.Text = this.Text

Tendría

[<AbstractClass>]
type MyAbstractClass() =
    abstract Name : string
    abstract Text : string

type MyClass() = 
    inherit MyAbstractClass()
    override __.Name = "name"
    override __.Text = "text"

¿Alguna advertencia o implicaciones que deba tener en cuenta?


5
2018-04-24 03:57


origen


Respuestas:


Lo único que debe tener en cuenta y tomar una decisión consciente es que una clase puede heredar de una sola clase pero implementar muchas interfaces.


Aparte de eso, algunas recomendaciones sobre el uso de clases abstractas o interfaces:

  • Si prevé crear varias versiones de su componente, cree un   clase abstracta. Clases abstractas   proporcionar una manera simple y fácil de   versiona tus componentes. Actualizando   La clase base, todas las clases heredadas.   se actualizan automáticamente con el   cambio. Interfaces, por otro lado,   no se puede cambiar una vez creado. Si un   La nueva versión de una interfaz es   obligatorio, debes crear una nueva   interfaz.
  • Si la funcionalidad que está creando será útil a través de una amplia   rango de objetos dispares, use una   interfaz. Las clases abstractas deben ser   Se utiliza principalmente para objetos que son   estrechamente relacionados, mientras que las interfaces   son los más adecuados para proporcionar común   funcionalidad a clases no relacionadas.
  • Si está diseñando bits pequeños y concisos de funcionalidad, use   interfaces. Si estas diseñando grandes   unidades funcionales, usa un resumen   clase.
  • Si desea proporcionar funcionalidad común, implementada entre todos   implementaciones de su componente, uso   una clase abstracta. Clases abstractas   Permitirle implementar parcialmente su   clase, mientras que las interfaces no contienen   Implementación para cualquier miembro.

http://msdn.microsoft.com/en-us/library/scsyfw1d%28vs.71%29.aspx

Personalmente, siento que estas recomendaciones son acertadas. Especialmente Las interfaces, por otro lado, no se pueden cambiar una vez creadas. Si se requiere una nueva versión de una interfaz, debe crear una interfaz completamente nueva. es un punto muy importante.


8
2018-04-24 04:08



Stephen,

Solo uno, el más básico y obvio ... Una interfaz permite implementaciones alternativas; Si el "tipo de publicación bien conocida" es una clase abstracta, no puede proporcionar más adelante alguna alternativas ... Así que la desventaja es que estás limitando tus opciones futuras; la ventaja es que (dependiendo de la cantidad de herederos que haya) puede guardar una gran cantidad de código de placa de caldera.

Si está realmente seguro de que NO hay otras implementaciones válidas, vaya a la clase abstracta. Si no es así, quédate con la interfaz.

Y supongo que PODRÍAS hacer las dos cosas ... y supongo que eso te daría lo mejor de ambos mundos.

Aclamaciones. Keith.

PD: manojlds tiene razón, por supuesto ... y muchísimo más sucinto ;-)


4
2018-04-24 04:16



En clase abstracta, puede implementar algún comportamiento común de todas las subclases.

En su diseño de interfaz, es posible que desee que un método llame a otro método para realizar una tarea compuesta. Por ejemplo, predictAll(Instance array)puede usar predictSingle(Instance) y proporciona una implementación predeterminada para todas las subclases. Si usas interfaz, necesitas implementar predictAll en todas las subclases

Pero este punto no es tan importante como el de herencia múltiple. Prefiero la interfaz más que la clase abstracta.

Interfaz también mantiene su diseño cetrino.

Un punto más: La interfaz alienta más funcional código de clase abstracta. Typeclass en Haskell es una interfaz más potente.


2
2018-04-24 04:22