Увидев ваши правки, я еще более твердо убежден, что способ реорганизовать этот код - использовать сопоставление с образцом. Для сопоставления с образцом требуется по крайней мере C # 7.0, поэтому я включу почти такой же хороший способ сделать это до версии 7.0.
Шаг 1
Отметьте свойства как устаревшие с помощью ObsoleteAttribute
и передайте true
для параметра error
.
[Obsolete("Use pattern matching instead.", true)]
public NullToolDataValue NullData => this as NullToolDataValue;
[Obsolete("Use pattern matching instead.", true)]
public DumbellDataValue DumbellData => this as DumbellDataValue;
[Obsolete("Use pattern matching instead.", true)]
public HeartRateDataValue HRData => this as HeartRateDataValue;
[Obsolete("Use pattern matching instead.", true)]
public SomeForceDataValue SomeForceData => this as SomeForceDataValue;
Это сделает ошибкой компилятора использование их в любом коде, обработанном компилятором. Если вы поразмышляете о них, вы получите вместо этого исключение времени выполнения (после выполнения шага 3), если вы также не измените этот код.
Шаг 2
Измените каждый сайт вызовов, который использует эти свойства, чтобы использовать сопоставление с шаблоном. Если все, что вы делаете, это то, что вы показали в вопросе, это должно быть так просто:
public class DumbellExcercise
{
public void ToolDataReceived(ToolData data)
{
if (data is DumbellDataValue dumbell)
Collection.Add(dumbell.WeightValue);
// OR
if (!(data is DumbellDataValue dumbell))
return;
Collection.Add(dumbell.WeightValue);
}
}
Второй вариант не так хорош, потому что условие должно быть заключено в скобки, прежде чем оно может быть отменено (эй, по крайней мере, у VB есть ключевое слово IsNot
; go figure), но вы получаете тот же ранний возврат, что и у существующего кода .
Похоже, вы используете по крайней мере C # 6.0, потому что вы используете оператор объединения нулей (?.
), но если вы не используете по крайней мере 7.0, вы можете сделать это вместо этого:
public class DumbellExcercise
{
public void ToolDataReceived(ToolData data)
{
DumbellDataValue dumbell = data as DumbellDataValue;
if (dumbell != null)
Collection.Add(dumbell.WeightValue);
// OR
DumbellDataValue dumbell = data as DumbellDataValue;
if (dumbell == null)
return;
Collection.Add(dumbell.WeightValue);
}
}
Шаг 3
Удалить свойства. Если ошибок компиляции больше нет, свойства не используются, поэтому вы можете избавиться от них.
Дополнительное примечание
Свойство IsValid
имеет странную двойственность. Он может быть назначен производными классами, но он также является виртуальным, поэтому его также можно переопределить. Вы действительно должны выбрать один. Если бы это было мое решение, я бы оставил его виртуальным и сделал бы его доступным только для чтения.
public abstract class ToolData
{
// Continue to assume it's true...
public virtual bool IsValid => true;
}
public class NullToolDataValue : ToolData
{
// ...and indicate otherwise as needed.
public override bool IsValid => false;
}