Переопределение методов классов в странной ситуации

Я видел как один человек после наследования функциональности одного класса другим переопределял методы, не добавляя никакой логики в них. То есть приведу пример:

class A{
...
public virtual void Calc() // здесь есть уже логика
}

class B: A{
 public void override Calc(){
   base.Calc(); 
 }
}

То есть казалось бы по умолчанию и так уже есть этот функционал в виде метода Calc() и можно было бы не переопределять его, чтобы использовать для своих задач, но здесь как то странно...Имеет ли смысл так переопределять методы в какой-то ситуации или нет?


Ответы (1 шт):

Автор решения: Frehzy

Представьте, у вас есть 1 класс, у которого есть некоторая логика по нанесению урона. У данного класса идеально всё протестировано и всё прекрасно работает. От него наследуются множество классов: ёжики, феи, ведьмы и прочее.

internal abstract class BaseEntity
{
    public int HP { get; protected set; }

    public virtual void Damage(int damage)
    {
        HP -= damage;
    }
}

Но тут вы захотели добавить змею себе в игру, по которой проходит двойной урон, в случае, если после основного урона у неё остаётся меньше 50 здоровья. Очевидно, что вы не будете переписывать логику базового класса, а просто добавите переопределение основного.

internal class Snake : BaseEntity
{
    public override void Damage(int damage)
    {
        base.Damage(damage);
        if (HP < 50)
            HP -= damage * 2;
    }
}

А теперь представьте, что вы добавили обычного персонажа Player, по которому не проходит какой-то дополнительный урон и т.д, но у него так же есть какие-то свои характеристики (показатели брони и т.д.)

internal class Player : BaseEntity
{ 
    public int Armor { get; private set; }
}

В таком случае, переопределять метод Damage не имеет смысла, т.к. это будет не больше, чем бесполезное увеличение количества строк кода. Необходимо лишь вызвать метод Damage у базового класса (BaseEntity)

BaseEntity player = new Player();
player.Damage(20);
→ Ссылка