Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 25.10.2015
Сообщений: 18
1

Передача объектов другого класса в конструктор через params

18.06.2017, 20:26. Просмотров 3034. Ответов 8
Метки нет (Все метки)


Здравствуйте. В учебнике есть пример: класс Figure, класс Point. В зависимости от того, сколько "вершин" принимает конструктор класса Figure, перегрузить его конструктор (принимает от 3 до 5 вершин). Следовательно, у Figure есть поле массив объектов Point, который должен инициализироваться передаваемыми объектами

Код конструктора класса Figure (из учебника):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public Figure(Point p1, Point p2, Point p3)
        {
            point = new Point[3];
            point[0] = p1;
            point[1] = p2;
            point[2] = p3;
            type = "Triangle";
public Figure(Point p1, Point p2, Point p3, Point p4)
        {
            point = new Point[4];
            point[0] = p1;
            point[1] = p2;
            point[2] = p3;
            point[3] = p4;
            type = "Tetragon";
public Figure(Point p1, Point p2, Point p3, Point p4)
        {
            point = new Point[5];
            point[0] = p1;
            point[1] = p2;
            point[2] = p3;
            point[3] = p4;
            point[4] = p5;
            type = "Pentagon";
        }
Я его попробовал переделать и вот собственно вопрос: идентичен ли ниже приведенный способ? Не вылезут ли подводные камни, учитывая что тут используются ссылочные типы? (пока немного плаваю в работе с ссылочными типами )
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 public Figure(params Point[] arr)
        {
            int i = 0;
            point = new Point[arr.Length];
            while (i < arr.Length)
            {
                point[i] = arr[i++];
            }
            switch (i)
            {
                case (3): { type = "Triangle"; break; }
                case (4): { type = "Tetragon"; break; }
                case (5): { type = "Petagon"; break; }
            }
        }

(создание объекта класса Figure в main)
C#
1
            Figure figure = new Figure(new Point("A", 1, 1), new Point("B", 1, 4), new Point("C", 4, 4));
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.06.2017, 20:26
Ответы с готовыми решениями:

Передача управления из конструктора класса-родителя в конструктор класса-потомка
Здравствуйте. Возможно ли передать управление из конструктора класса-родителя в конструктор...

Поле класса содержит массив объектов другого класса
Добрый день. Есть класс Queue,который как поле содержит массив объектов на класс Pers. public...

Поле класса - массив объектов другого класса
Здравствуйте. У меня определен класс Article, в котором определен конструктор по умолчанию. Затем...

Передача названия класса в метод другого класса в качестве входных данных
У меня есть класс &quot;class1&quot;, от которого наследуется несколько однотипных классов classX, classY,...

8
29 / 46 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
18.06.2017, 20:56 2
Лучший ответ Сообщение было отмечено max_jam как решение

Решение

Вполне пойдет, только я бы немного переделал.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Figure
{
    private static readonly Dictionary<int, string> Types = new Dictionary<int, string>
    {
        { 3, "Triangle" },
        { 4, "Tetragon" },
        { 5, "Petagon" }
    };
    
    public Point[] Points { get; }
    
    public string Type { get; }
    
    public Figure(params Point[] points)
    {
        Points = points;
        Type = Types[points.Length];
    }
}
Копировать массив params не надо, ведь он создается в месте вызова. Максимум можно сделать points.Clone() если планируешь передавать туда уже сформированный массив.
1
0 / 0 / 0
Регистрация: 25.10.2015
Сообщений: 18
18.06.2017, 21:45  [ТС] 3
Спасибо за ответ!
То есть, можно просто в конструкторе написать point = arr, а не копировать каждый элемент через цикл?

Добавлено через 1 минуту
Точно, увидел в коде
0
2760 / 1998 / 1004
Регистрация: 14.08.2016
Сообщений: 6,862
18.06.2017, 21:50 4
тогда уж enum вместо Dictionary, кошернее смотриццо
1
Администратор
Эксперт .NET
13070 / 10653 / 4397
Регистрация: 17.03.2014
Сообщений: 21,455
Записей в блоге: 1
18.06.2017, 22:17 5
Цитата Сообщение от max_jam Посмотреть сообщение
идентичен ли ниже приведенный способ?
Нет т.к. позволяет передать меньше 3 или больше 5 вершин. Оригинал же позволяет передать только 3, 4 или 5 вершин.
1
34 / 34 / 16
Регистрация: 04.06.2017
Сообщений: 158
18.06.2017, 22:36 6
Цитата Сообщение от max_jam Посмотреть сообщение
идентичен ли ниже приведенный способ? Не вылезут ли подводные камни,
А что произайдет если я передам в ваш конструктор одну или 7 точек?
1
0 / 0 / 0
Регистрация: 25.10.2015
Сообщений: 18
18.06.2017, 23:26  [ТС] 7
Точно! Может, вы подскажете, как красиво обойти эту проблему, при этом оставив params?
Кроме как передать готовый Point массив из Main'a, пока не приходят идеи )
0
.NET senior
437 / 355 / 137
Регистрация: 23.09.2016
Сообщений: 980
18.06.2017, 23:38 8
max_jam, можно бросать исключение, если переданный массив содержит меньше двух или более семи (например) точек. Это вполне естественное поведение, его легко задокументировать и оно наглядно показывает, как нужно правильно использовать Ваш класс.
0
Администратор
Эксперт .NET
13070 / 10653 / 4397
Регистрация: 17.03.2014
Сообщений: 21,455
Записей в блоге: 1
18.06.2017, 23:39 9
max_jam, можно сделать конструктор принимающий массив private, но польза такого подхода сомнительна.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Figure
{
    public Figure(Point p1, Point p2, Point p3)
        : this(new[]{p1, p2, p3})
    {
    }
    
    public Figure(Point p1, Point p2, Point p3, Point p4)
        : this(new[]{p1, p2, p3, p4})
    {
    }
    
    public Figure(Point p1, Point p2, Point p3, Point p4, Point p5)
        : this(new[]{p1, p2, p3, p4, p5})
    {
    }
 
    private Figure(params Point[] points)
    {
        point = points;
        switch (point.Length)
        {
            case 3: type = "Triangle"; break;
            case 4: type = "Tetragon"; break;
            case 5: type = "Petagon"; break;
        }       
    }
 
    ...
}

Я бы оставил начальный вариант, упростив его немного (и исправив ошибки)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Figure
{
    public Figure(Point p1, Point p2, Point p3)
    {
        point = new[] {p1, p2, p3};
        type = "Triangle";
    }
    
    public Figure(Point p1, Point p2, Point p3, Point p4)
    {
        point = new[] {p1, p2, p3, p4};
        type = "Tetragon";
    }
    public Figure(Point p1, Point p2, Point p3, Point p4, Point p5)
    {
        point = new[] {p1, p2, p3, p4, p5};
        type = "Pentagon";
    }
 
    ...
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2017, 23:39

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Передача большого количества параметров в конструктор класса
При инициализации класса необходимо передать по значению 7 массивов разных типов в конструктор...

Класс с листом объектов другого класса
Program.cs using System; using System.Collections.Generic; using System.Linq; using...

Передача данных из другого класса
Как передать данные в глобальные переменные из класса Class1.cs в Class2.cs? В метод - понятно как,...

Передача объектов класса (TCP)
Добрый день! Пишу клиент-серверное приложение. Основная задача сервера, обработка запросов и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.