Здравствуйте, SomewhereSomehow, Вы писали:
SS>И хотелось бы во втором классе, который унаследован от составной фигуры, обращаться к элементам массива дочерних фигур как к типу класса унаследованной простой фигуры, а не базовой простой фигуры.
Загадочный вопрос
SS>Немного путанно звучит, наверное понятнее будут по коду.
SS>
SS> // вот тут хотелось бы иметь коллекцию типа List<SimpleShape> а не List<ShapeBase>
SS> // чтобы не разыменовывать, а обращаться напрямую ведь cs.Shapes лежат объекты SimpleShape
SS> // а не ShapeBase. Хотя конечно я нигде это не указывал, потмоу как если попытаться в CompositeShape
SS> // добавить public override List<SimpleShape> Shapes { get; set; } - будет ошибка:
SS> // "CompositeShape.Shapes': type must be 'System.Collections.Generic.List<ShapeBase>' to match overridden member 'ShapeCompositeBase.Shapes'"
SS> ((SimpleShape) cs.Shapes[0]).SpecProperty = 1;
SS> // вместе с тем нужно сохранить возможность передавать объекты коллекции на обработку как ShapeBase
SS> ShowSizes(cs.Shapes[0]);
SS> ShowSizes(cs);
SS> /*
SS> * соответственно вопрос
SS> * как можно в производном классе сложной фигуры, хранить коллекцию конкретных простых фигур,
SS> * пока нашел только способ с промежуточным классом-коллекцией, которая инкапсулирует преобразование
SS> * из ShapeBase в SimpleShape, а само свойство в CompositeShape скрывается следующим образом:
я бы делал примерно так - сам композит не стоит перегружать лишними методами, пропертями.
[c#]
public static class Helper
{
public static IList<TShape> Shapes(this ShapeBase shapeBase)
where TShape : ShapeBase
{
return Shapes.CastTo<TShape>().ToList();
}
}