| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .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 MyType и Shape shape = new MyType, если MyType наследуется от Shape. |