Re: Паттерн Composite
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.09.10 13:32
Оценка: -1
Здравствуйте, 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();
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.