It all depends on if AbstractB implements C
semantically. I.e if it makes sense semantically for AbstractB
to implement C
, then go for it.
If we take concrete examples the semantic difference becomes clear.
If A = Dog , AbstractB = Animal, C = IBark
Only choice that makes sense is
class Dog extends Animal implements IBark{
This makes no sense, since this would imply that all animals bark.
class Animal implements IBark{
The other differences come into play if you have more than just class A
inheriting from AbstractB
. In #1 they need not implement C, in #2 they are all forced to implement C.