Как добавить защищенный виртуальный метод в класс «Компонент», чтобы его можно было вызвать из «Композитного»?Композитный шаблон в C++ и C# - защищенные виртуальные методы
В качестве конкретного примера рассмотрим приведенный ниже код и, пожалуйста, расскажите, как избежать ошибки компилятора в DxCompositeShape.ComputeSize
.
abstract class DxShape // this is the Component
{
public abstract void Paint();
protected abstract void ComputeSize();
}
class DxCompositeShape : DxShape // this is the Composite
{
public readonly IList<DxShape> Shapes = new List<DxShape>();
public override void Paint()
{
this.ComputeSize();
}
protected override void ComputeSize()
{
foreach (DxShape sh in Shapes)
{
sh.ComputeSize(); // compiler error CS1540
}
// and some other logic here
}
}
EDIT: Я изменил мой образец, так что я ComputeSize
вместо Init
(люди полагают, что Init всегда можно назвать в конструкторе).
Итак, вы даете нам код C#, но ваш вопрос касается как C++, так и C#? Зачем? –
@SebastianRedl Если код переведен на C++, у нас та же проблема. –
Если код C++, вы можете использовать 'friend'. – Xaqq