Тема: Де використовувати абстрактні класи, а де інтерфейси?
Привіт. Сьогодні йду додому з однокурсником, і почав пояснювати йому за класи, інтерфейси, та наслідування. Хтів привести два приклада, де треба використати наслідування класу, і де треба використовувати наслідування інтерфейсу, в результаті сам заплутався. 
 Я так розумію, всі ці наслідування треба використовувати як для виключення дублювання кода, так і для створення абстракції. В мене приклад був такий: є два види м'ячів, перший - дерев'яний, а другий - гумовий. Нам не зручно використовувати два контейнера для обох видів м'ячів і необхідно абстрагувати їх до одної сутності - мяч. Для цього я б використав абстрактний класс, і вийшло б щось типу цього
class Program
    {
        static void Main(string[] args)
        {
            ball[] i = new[] {(ball)new WoodenBall(),new RubberBall()};
            foreach (var b in i)
            {
                Console.WriteLine(b.GetBall());
            }
            Console.Read();
        }
    }
    abstract class ball
    {
        public abstract string GetBall();
    }
    class WoodenBall:ball
    {
        public override string GetBall()
        {
            return "WoodenBall";
        }
    }
    class RubberBall : ball
    {
        public override string GetBall()
        {
            return "RubberBall";
        }
    }А потім я хтів придумати приклад з використанням інтерфейсу, але чомусь не зміг. Звичайно, я можу замінити абстрактний клас на інтерфейс з сигнатурою одного метода, потім по різному реалізувати цей метод в відповідних класах, що наслідують той інтерфейс і в мене вийде те ж саме, що й з абстрактним класом. Навіщо ж тоді мені той інтерфейс взагалі потрібен? Я знаю, що можна наслідуватись від декількох інтерфейсів, але не зовсім розумію, де це може знадобитись?
