Cuándo usar clases abstractas?

Aquí está el artículo de MSDN sobre clases abstractas , pero realmente no lo entiendo …

¿Cuándo debería usar realmente las clases abstractas? ¿Cuáles son las ventajas de usar clases abstractas?

Las clases abstractas son útiles cuando necesita una clase con el fin de heredar y polymorphism, pero no tiene sentido crear una instancia de la clase en sí, solo sus subclases. Se usan comúnmente cuando se quiere definir una plantilla para un grupo de subclases que comparten algún código de implementación común, pero también se quiere garantizar que los objetos de la superclase no se puedan crear.

Por ejemplo, digamos que necesitas crear objetos de Perro, Gato, Hámster y Pez. Poseen propiedades similares, como el color, el tamaño y el número de patas, así como el comportamiento, por lo que se crea una superclase Animal. Sin embargo, ¿de qué color es un Animal? ¿Cuántas patas tiene un objeto Animal? En este caso, no tiene mucho sentido crear una instancia de un objeto de tipo Animal, sino solo sus subclases.

Las clases abstractas también tienen el beneficio adicional en polymorphism, lo que le permite usar el tipo de superclase (abstracta) como un argumento de método o un tipo de retorno. Si, por ejemplo, tiene una clase PetOwner con un método train (), puede definirla como aceptar un objeto de tipo Animal, por ejemplo, tren (Animal a) en lugar de crear un método para cada subtipo de Animal.

Al usar clases abstractas, podemos hacer que la clase sea más genérica.

Por ejemplo: si la clase A es una clase abstracta y hay clases clase B, clase C y clase D que extienden la clase abstracta A, estas subclases heredarán un método que ya está declarado en la clase abstracta A, haciendo que el método sea más genérico.

Los usas para clases que nunca se crearán (así que efectivamente no existen), pero quieres heredarlas por razones de polymorphism.

Use clases abstractas cuando esté definiendo el comportamiento de una clase en la jerarquía de su clase que nunca se usará para instanciar un objeto directamente.

Entonces, piensa en ti como Dios por un momento. Sus clases de CBabyBoy y CBanyGirl no serían abstractas, ya que son objetos sólidos que se crean. Por otro lado, sus clases CPerson y CAimal serían abstractas; son útiles desde el punto de vista de jerarquía de tipos, pero nunca ejecutará CAnimal dingbat = new Animal();

Richard ha proporcionado un ejemplo en el que una clase abstracta tiene ventajas sobre las clases no abstractas.

Me gustaría agregar una tabla de hechos para elegir entre una clase abstracta y una interfaz. La imagen se puede encontrar aquí .

enter image description here

Básicamente, debe usar una clase abstracta, cuando alguna entidad en su jerarquía lógicamente tendrá métodos que no sabe cómo implementar, pero sí sus descendientes. Hay miles de millones de ejemplos de “vida real” en toda la web, de verdad)