views:

139

answers:

5

Here is the msdn article on abstract class but i really dont get it... When should i really use abstract classes? What are the advantages of using abstract classes?

A: 

This I found by typing "Why use abstract classes" into Google.

Should I use an abstract class or an interface?

Lazarus
A: 

Basically, you should use an abstract class, when some entity in your hierarchy logically will have method(s) it does not know how to implement, but it's descendants do. There are billions of 'real life' examples all over the web, really)

n535
Rather than 'does not know' that should really be 'cannot or should not'. Even in the basic Shape object example the draw method could be implemented as an empty method but should it?
Lazarus
Interesting point of view) But i mean, that empty implementation does not count of course=)
n535
A: 

Use abstract classes when you are defining behaviour for a class in your class heirarchy that is never going to be used to instantiate an object directly.

So, think of yourself as God for a moment. Your CBabyBoy and CBanyGirl classes wouldn't be abstract - as these are solid objects that do get created. On the other hand, your CPerson and CAnimal classes WOULD be abstract - they're useful from a type hierarchy point of view, but you won't ever be running CAnimal dingbat = new Animal();

Martin Milan
+3  A: 

Abstract classes are useful when you need a class for the purpose of inheritance and polymorphism, but it makes no sense to instantiate the class itself, only its subclasses. They are commonly used when you want to define a template for a group of subclasses that share some common implementation code, but you also want to guarantee that the objects of the superclass cannot be created.

For instance, let's say you need to create Dog, Cat, Hamster and Fish objects. They possess similar properties like color, size, and number of legs as well as behavior so you create an Animal superclass. However, what color is an Animal? How many legs does an Animal object have? In this case, it doesn't make much sense to instantiate an object of type Animal but rather only its subclasses.

Abstract classes also have the added benefit in polymorphism–allowing you to use the (abstract) superclass's type as a method argument or a return type. If for example you had a PetOwner class with a train() method you can define it as taking in an object of type Animal e.g. train(Animal a) as opposed to creating a method for every subtype of Animal.

richard
Animal would define the need for colour, number of legs, and size properties so when addressing Cat as an Animal then I fervently expect Animal to have a colour, number of legs and size. I also think that you could quite legitimately implement those properties in the base class as to do otherwise would lead to duplicated code. The descriptions here are getting a little caught up in properties rather than methods, there'd be no point in Animal implementing a 'Move' method as each animal may have a different method of locomotion but it would define the need for a 'Move' method.
Lazarus
A: 

You use them for classes which will never be created (so effectively don't exist), but you want to inherit from them for polymorphism reasons.

DeadMG