In layered programming go for interfaces.So that one team can make the layer with the interface without bothering about the implementation of that interface. Abstract class is used to represent something in OO concept where someof the common implementation are common and some are case specific.So you can define the common functionalities as concrete and leave remaining as abstract to be implemented by the class which would extend this class.