Нет, вы можете сделать это protected
. Таким образом, ваш производный класс будет по-прежнему иметь доступ к нему и сможет его переопределить, но он не будет разрешен публично.
Хорошее мышление, это именно то, как это сделать: переопределить как можно меньше и скрыть как можно больше.
- Edit -
Так как это, вероятно, упрощенный пример того, что вы на самом деле делаете, я могу предоставить только предположение того, что делают эти методы, но здесь оно идет.
У меня такое чувство, что метод 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;
}
}
Не совсем понятно, что вы пытаетесь выполнить, так как ваш код выглядит неполным. Например, поле '_Value' нигде не используется, а также параметр' value' в методе DoSomeWork. Было бы полезно показать, как они должны взаимодействовать. Сейчас DoSomeWork выглядит излишним, и 'Calculate', кажется, выполняет всю работу (и поэтому должен быть общедоступным). С другой стороны, может оказаться, что 'Calculate' вообще не принадлежит к этому классу, что я подозреваю с первого взгляда. – Groo
@Groo _Value используется в классе 'Root'. Я редактировал вопрос, чтобы «использовать» параметр 'value'. Я согласен, что именно «архитектура», скорее всего, виновата. Общая идея заключается в том, что потребитель должен создать экземпляр класса «Root», а затем порождать детей с помощью «CreateChild» при использовании DoSomeWork. В идеале все остальные участники не должны быть видны. (который включает 'Child' ctor) – clearpath
Я обновил свой ответ. – Groo