Сохранение приватности по определению должно предотвратить этот точный сценарий.
Наилучшим вариантом будет реализация защищенного установщика:
public class BaseClass
{
public Values {
get { return _values; }
protected set { _values = value; }
}
}
Таким образом, ваш InheritingClass имеет доступ к установщику и может выполнять:
this.Values = new InhertingList<string>();
Но поскольку вы не можете изменить базовый класс, технически это возможно сделать с помощью отражения (в сценарии полного доверия). Я не рекомендую этот подход, хотя:
FieldInfo field = typeof(BaseClass).GetField("_value", BindingFlags.Instance | BindingFlags.NonPublic );
field.SetValue(this, this.Values = new InhertingList<string>() );
Опасность выполнения того, что вы пытаетесь, между прочим, заключается в том, что вы собираетесь изменить реализацию, определенную в BaseClass, на то, что вы предоставляете. Очень легко вводить тонкие ошибки, поскольку вы (целенаправленно) «ломаете» детали реализации в базовом классе.
Я бы попробовал переосмыслить ваш алгоритм и посмотреть, есть ли другой способ обойти эту проблему.