Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Создание в классе поля динамического типа


Автор: GenkaRu 5.4.2010, 18:33
Подскажите пожалуйста, есть ли способ в конструкторе класса записывать в поле значения разных типов в зависимости от входных параметров?

 Ситуация такая, пишу что-то вроде конструктора домов из блоков, у меня есть класс "Стена", стена может быть прямоугольником, либо прямоугольной трапецией, поэтому сделал ей поле shape, класса Shape, который хранил бы всю информацию о структуре стены, смысл в том, чтобы со всеми стенами можно было бы легко и единообразно работать, но при этом каждая имела бы свою форму, и своё количество описывающих форму точек, в общем код выглядит так:

    class Wall             
    {        
        public Shape shape;                 //Форма стены, содержит размеры
        public float width;

        public Wall(Point p1, Point p2) // конструкторы..
        {
            shape = new Line(p1, p2);
        }
        public Wall(Point p1, Point p2, int h1)
        {
            shape = new ShapeRectangle(p1,p2,h1);
        }
        public Wall(Point p1, Point p2, int h1, int h2)
        {
            shape = new ShapeRectTrapezoid(p1, p2, h1, h2);
        }
    }
    
    public class ShapeRectTrapezoid : Shape
    {
        public ShapeRectTrapezoid(Point p1, Point p2, int h1, int h2)
        {
            point1 = p1;
            point2 = p2;
            height1 = h1;            
            heigth2 = h2;
        }
    }
     
    public class Shape
    {
        public Point point1;
        public Point point2;
    }

Хочется сделать так, чтобы было удобно создавать объекты Wall, передавая 2, 3 или 4 параметра, а подходящий конструктор создавал бы нужный объект - наследник класса Shape (прямоугольник, линия, прямоуг. трапеция), и вписывал бы его в поле shape объекта, типа shape = new ShapeRectangle(p1,p2,h1); с тем чтобы потом можно было обращаться к этим параметрам таким образом:

              Wall.shape.point1 или  Wall.shape.height2 в случае, если форма - трапеция и присутствует дополнительная высота во второй точке. 

Трабл в том, что Wall.shape делать не получается, доступ открывается только к объявленным в Shape point1 и point2. Что мешает их увидеть, что сделано не так, и можно ли вообще соорудить то, что я описал, или, возможно, это дико, и так не делают, а принято делать по-другому? Спасибо за внимание, любая помощь оживлённо приветствуется!)) 

Автор: jorikdima 5.4.2010, 19:10
Используй тип object - это прородитель всех типов. 
Можешь сделать:
object shape = new ЛюбойТИП();

Автор: jonie 5.4.2010, 20:22
почитайте про пораждающие паттерны: http://ooad.asf.ru/Patterns_title.aspx?IdKat=1 и в гугле, возможно то что вы хотите велосипед 8)

Автор: GenkaRu 5.4.2010, 22:57
Спасибо, про шаблоны зачту!) 

Цитата

object shape = new ЛюбойТИП();


Сенькс, я попробую! Правда не вижу фундаментальной разницы между выражениями object shape = new MyType и Shape shape = new MyType, если MyType наследуется от Shape.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)