![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
GenkaRu |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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. Что мешает их увидеть, что сделано не так, и можно ли вообще соорудить то, что я описал, или, возможно, это дико, и так не делают, а принято делать по-другому? Спасибо за внимание, любая помощь оживлённо приветствуется!)) |
|||
|
||||
jorikdima |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 18.1.2008 Где: Там, где Зенит Репутация: нет Всего: нет |
Используй тип object - это прородитель всех типов.
Можешь сделать: object shape = new ЛюбойТИП(); |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
почитайте про пораждающие паттерны: http://ooad.asf.ru/Patterns_title.aspx?IdKat=1 и в гугле, возможно то что вы хотите велосипед 8)
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
GenkaRu |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.4.2010 Репутация: нет Всего: нет |
Спасибо, про шаблоны зачту!)
Сенькс, я попробую! Правда не вижу фундаментальной разницы между выражениями object shape = new MyType и Shape shape = new MyType, если MyType наследуется от Shape. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |