Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание в классе поля динамического типа, красивое решение? 
:(
    Опции темы
GenkaRu
  Дата 5.4.2010, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.4.2010

Репутация: нет
Всего: нет



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

 Ситуация такая, пишу что-то вроде конструктора домов из блоков, у меня есть класс "Стена", стена может быть прямоугольником, либо прямоугольной трапецией, поэтому сделал ей поле 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. Что мешает их увидеть, что сделано не так, и можно ли вообще соорудить то, что я описал, или, возможно, это дико, и так не делают, а принято делать по-другому? Спасибо за внимание, любая помощь оживлённо приветствуется!)) 
PM MAIL   Вверх
jorikdima
Дата 5.4.2010, 19:10 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

Репутация: нет
Всего: нет



Используй тип object - это прородитель всех типов. 
Можешь сделать:
object shape = new ЛюбойТИП();
PM MAIL   Вверх
jonie
Дата 5.4.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
GenkaRu
Дата 5.4.2010, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.4.2010

Репутация: нет
Всего: нет



Спасибо, про шаблоны зачту!) 

Цитата

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


Сенькс, я попробую! Правда не вижу фундаментальной разницы между выражениями object shape = new MyType и Shape shape = new MyType, если MyType наследуется от Shape.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.