ryanba29 Ответов: 1

Является ли изменение метода с абстрактного на виртуальный в базе критическим изменением для дочерних классов


У меня есть абстрактный класс, который реализует смесь виртуальных и абстрактных методов. Один из методов, который был создан как абстрактный, действительно должен быть виртуальным, поскольку существует реализация по умолчанию. Мой вопрос заключается в том, что, поскольку метод полностью готов к перезаписи в любых исключающих дочерних классах, изменение метода с абстрактного на виртуальный будет разрушительным изменением? Смотреть ниже.

Хотел бы изменить это.
public abstract class MyBaseClass
{
public MyBaseClass();

public abstract void DoTask();
}


До настоящего времени
public abstract class MyBaseClass
{
public MyBaseClass();

public virtual void DoTask()
{
//Do defauld task or override me.
}
}

влияют ли все дочерние классы, полностью готовые к наследованию от MyBaseClass?

Что я уже пробовал:

Я попытался протестировать это в самой простой форме, но меня беспокоит сценарий более сложный, чем ниже, о котором я не думаю?

public abstract class Class1
    {
        public string s;
        public Class1() { }

        public virtual void DoTask();
    }

public abstract class Class1
    {
        public string s;
        public Class1() { }

        public virtual void DoTask()
        {
            s = "in class one";
        }
    }
    public class Class2: Class1
    {
        public Class2()
        {

        }
        public override void DoTask()
        {
            s = "in class two";
        }
    }

1 Ответов

Рейтинг:
5

OriginalGriff

Нет, переход от виртуального к абстрактному был бы разрушительным изменением, поскольку он добавляет требование ко всем производным классам для реализации метода. Если они этого не сделают, они больше не будут компилироваться.
Но переход от абстрактного к виртуальному снижает требования к "вы можете реализовать это, но вам это не нужно", что не является кардинальным изменением.