У меня следующий код.И мне нужно скрыть одну функцию интерфейса.
interface IOne
{
int FunctionOne();
}
interface ITwo
{
double FunctionTwo();
}
interface IInterfaceToImplement : IOne, ITwo
{
void AFunctionToImplement();
}
public abstract MyBaseClass : TheVeryHeavyBaseClass<T, IInterfaceToImplement>, IInterfaceToImplement
{
public abstract void AFunctionToImplement(); // How to force this one to be protected?
public virtual int FunctionOne() { return 0; }
public virtual double FunctionTwo() { return 0.0; }
}
public MyConcreteClass : MyBaseClass
{
public override void AFunctionToImplement(); // How to force this one to be protected?
}
Как видите, у меня есть базовый класс.И мне нужно, чтобы AFunctionToImplement()
было спрятано.У меня плохой дизайн классов?Любые предложения о том, как защитить функцию от вызова?
РЕДАКТИРОВАТЬ.Ответ на вопрос Павла Минаева в комментариях.
Мне нужно, чтобы каждый конкретный класс реализовывал список функций из IInterfaceToImplement.Также мне нужен каждый конкретный класс, чтобы иметь возможность хранить классы типа IInterfaceToImplement. Это древовидное хранилище данных. Каждая «ветвь» хранилища должна выполнять те же операции, что и любая другая ветвь.Но никто, кроме «корня» и других «веток», не должен называть эти операции.
EDIT2 Мое решение.
Спасибо Мэтью Эбботу и Павлу МинаевуЯ наконец осознал свою проблему - это мозг.:)
Нет, я шучу.:) Проблема в том, что я думал о корневых и отраслевых классах как об одной и той же ветке.Теперь я понимаю - рут не должен реализовывать IInterfaceToImplement
.Смотрите решение:
public class MyRootClass : IOne, ITwo
{
private IInterfaceToImplement internalData = new MyConcreteClass();
public int FunctionOne() { return this.internalData.FunctionOne(); }
public double FunctionTwo() { return this.internalData.FunctionTwo(); }
}