C#. Могу ли я автоматически заменить производный класс вместо базового

Язык C#.
Скажем, у меня есть переопределенный метод в классе A

    class A:B
    {
        protected override void Method(BaseClass bc)
        {
            (DerivedClass)bc.DerivedClassField = blabla;
        }
    }

Есть ли какая-либо библиотека / языковая функция / и т.д., с помощью которой я могу написать следующее:

    class A:B
    {
        protected override void Method(BaseClass bc)
        {
            bc.DerivedClassField = blabla;
        }
    }

например, добавив некоторый атрибут в класс A или что-то еще?
Извините за дерьмовое форматирование.

2 ответа

Решение

Вы можете использовать дженерики, чтобы сделать это безопасным для типов способом:

class A<T> where T : BaseClass {
    protected virtual void Method(T bc) { ... }
}

class B : A<DerivedClass> {
    protected override void Method(DerivedClass bc) {
        bc.DerivedClassField = blabla;
    }
}

но это может вызвать другие проблемы, если вы даже хотите использовать A<T> не зная Tв этом случае я бы использовал приведение (если структура класса означает, что приведение не завершится неудачей) или переопределил вашу объектную модель.

Вы можете разыграть bc как DerivedClass, если вы уверены, что это то, что есть.

class A:B
{
    protected override void Method(BaseClass bc)
    {
        ((DerivedClass)bc).DerivedClassField = blabla;
    }
}
Другие вопросы по тегам