Нет, вы можете сделать это protected
. Таким образом, ваш производный класс по-прежнему будет иметь к нему доступ и сможет его переопределить, но это не будет разрешено публично.
Хорошее мышление, это именно то, что нужно сделать: переопределить как можно меньше и спрятать как можно больше.
- Правка -
Поскольку это, вероятно, упрощенный пример того, что вы на самом деле делаете, я могу только дать предположение о том, что делают эти методы, но здесь это так.
У меня такое ощущение, что метод Calculate
может не принадлежать вашему классу Base
. Похоже, что он обеспечивает вспомогательный результат вычисления, используемый DoSomeWork
. Наследование обычно используется, когда ваш базовый класс имеет некоторые общие вычисления, чтобы «предложить» производным классам, чтобы вам не пришлось повторяться.
Например, предположим, что ваш метод DoSomeWork
имеет некоторые определенные функциональные возможности, которые не меняются, но требуют, чтобы сначала выполнялись "внешние" вычисления. Если вы начали с создания простого отдельного интерфейса для внешнего расчета:
interface ICalculator
{
double Calculate();
}
Вы можете определить различные реализации этого интерфейса. Вы можете начать с создания простой реализации (аналогично вашей Root
функциональности):
class SimpleCalculator : ICalculator
{
readonly double _value;
public SimpleCalculator(double value)
{
_value = value;
}
public double Calculate()
{
return _value;
}
}
И вы также можете легко обернуть существующие реализации в более сложные классы (аналогично тому, что CreateChild
намеревается сделать):
// for the rest of the world, this is an ICalculator like any other
class CalculatorWrapper : ICalculator
{
readonly ICalculator _base;
public CalculatorWrapper(ICalculator baseCalc)
{
_base = baseCalc;
}
public double Calculate()
{
double value = _base.Value;
return 2 * value;
}
}
А затем, ваш фактический класс должен использовать эту функциональность для некоторой предполагаемой «дополнительной работы»:
interface MyWorker
{
double DoSomeWork(int value);
}
class YourClass
{
readonly ICalculator _calc;
readonly double _someOtherValue;
public YourClass(ICalculator calc, double someOtherValue)
{
_calc = calc;
_someOtherValue = someOtherValue;
}
public double DoSomeWork(int value)
{
// use whatever you get from your calc
double externalValue = _calc.Calculate();
// and do some "actual work"
return _someOtherValue + value + externalValue;
}
}
или , вы можете передать «калькулятор» в DoSomeWork
при каждом вызове в качестве параметра и изменить комплексный класс на что-то вроде:
interface MyWorker
{
double DoSomeWork(ICalculator calc, int value);
}
class YourClass
{
public double DoSomeWork(ICalculator calc, int value)
{
// use whatever you get from your calc
double externalValue = calc.Calculate();
// and do some "actual work"
return _someOtherValue + value;
}
}