214 / 214 / 20
Регистрация: 18.05.2010
Сообщений: 860
1

Конструктор на основе данных базового класса

11.10.2011, 13:26. Показов 1638. Ответов 9
Метки нет (Все метки)

Допустим есть класс который наследуется от друго класса и в качестве конструктора можно использовать данные из базовго класса. Как сделать так чтобы не перечислять все поля класса а присвоить все данные базового класса экземпляру базового класса, т.к. поля базового класса могут меняться.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public class A
    {
        public int Field1 { get; set; }
        public int Field2 { get; set; }
        public int Field3 { get; set; }
        public int Field4 { get; set; }
        public int Field5 { get; set; }
    }
 
    public class B : A
    {
        public string F1 { get; set; }
 
        public B(A a)
        {
            this.Field1 = a.Field1;
            this.Field2 = a.Field2;
            // вместо всего этого перечисления что можно здесть поставить???
            // чтобы не перечислять все поля
        }
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2011, 13:26
Ответы с готовыми решениями:

Класс: Создать на основе базового класса Car три класса-автомобиля: Тойота, Феррари, Бугатти.
Всем привет! На днях дали эту задачу, пытался делать по-разному не хоть убей не могу сделать. К...

Конструктор базового класса c#
Дано class B:A { bool i; B(A a, bool s) { i = s; } }

Конструктор базового класса
вот код наследника namespace Inheritance1_1 { class SalePurchase : Purchase { ...

Создать конструктор производного и базового класса с переменными
Помогите доделать задание, нужно создать конструктор производного и базового класса с переменными и...

9
Эксперт .NET
16739 / 12492 / 3283
Регистрация: 17.09.2011
Сообщений: 20,719
11.10.2011, 14:55 2
Можно через рефлексию, но это будет идиотизм.

Лучше всего делать именно как у вас: перечислять поля.

Цитата Сообщение от Башир Посмотреть сообщение
поля базового класса могут меняться.
Это как?
0
214 / 214 / 20
Регистрация: 18.05.2010
Сообщений: 860
11.10.2011, 15:27  [ТС] 3
Поля могут меняться, т.к. программный код может поменяться и получится, что если меняется базовый класс, то дочерние классы тоже надо менять. немного неудобно. Написал простенький код, может кому и понадобится))
C#
1
2
3
4
5
6
7
8
9
10
11
        public static void SetProperties(object obj1, object obj2)
        {
            Type t1 = obj1.GetType(), t2 = obj2.GetType();
            foreach (var v in t1.GetProperties())
            {
                if (t2.GetProperties().ToList().Exists((x) => x.Name == v.Name && x.PropertyType == v.PropertyType))
                {
                    v.SetValue(obj1, t2.GetProperty(v.Name).GetValue(obj2, null), null);
                }
            }
        }
Добавлено через 2 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Можно через рефлексию, но это будет идиотизм.
именно так я и сделал ))) хоть идИотизм, но в моей программе 'присваивать поля часто приходится делать' (о.О)
0
Эксперт .NET
16739 / 12492 / 3283
Регистрация: 17.09.2011
Сообщений: 20,719
11.10.2011, 15:40 4
Цитата Сообщение от Башир Посмотреть сообщение
Поля могут меняться - т.к программный код может поменяться и получится что если меняется базовый класс то дочерние классы тоже надо менять.
Это нормальное явление на стадии итеративной модели разработки приложения. Меняется архитектура - меняется и код, ее реализующий.
То, что вы делаете с помощью рефлексии, называется жертвование производительностью финального продукта ради избежания одной из стадий разработки. В результате из-за того, что разработчик поленился потратить время на изменение и тестирование класса, конечный пользователь будет наслаждаться тормозами на протяжении жизни приложения.
Это если вдруг интересно, почему использовать рефлексию в данном случае - идиотизм

P.S. А потом еще и холиворы в стиле "сишарп тармазной!!11" начинаются
2
214 / 214 / 20
Регистрация: 18.05.2010
Сообщений: 860
11.10.2011, 16:06  [ТС] 5
согласен, но полей у меня очень много и часто из за того что я что то пропустил возникают ошибки, а так гарантировано и разработка будет быстрее. прислушаюсь к вашему совету и в конце разработки все поля поставлю ручным методом. Но я думаю что тормоза будуд в том случае если в программе будет изобилие создание экземпляров подобного класса)) а у меня он создается в единичном случае и в статическом классе.

Цитата Сообщение от kolorotur Посмотреть сообщение
холиворы в стиле "сишарп тармазной
А это (холиворы) с чем едят? не понял этого слова.
0
Заблокирован
11.10.2011, 16:15 6
Холивар (от англ. holy war, священная война) — общее название споров между людьми, являющимися приверженцами диаметрально противоположных мнений, которые они не желают менять. Такой спор принципиально бессмысленен, так как ни один из участников дискуссии не собирается выслушивать и обдумывать доводы своего оппонента.
как-то так

Специальный раздел на форуме
1
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 3
12.10.2011, 08:57 7
Можно пойти вот таким путем
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   public class A
    {
         public A(A a)
         {
              // Присваиваем значения полям
         }
    }
 
    public class B : A
    {
        public string F1 { get; set; }
 
        public B(A a)
          : base(a) 
        {
            // Инициализация полей которых нет в класса A
        }
    }
Тем самым если от базового класса много производных, то экономия написанного кода на лицо.
0
214 / 214 / 20
Регистрация: 18.05.2010
Сообщений: 860
12.10.2011, 11:30  [ТС] 8
Лабутин Виктор, Это как? конструктор принимает в качестве параметра эеземпляр самого класса которым он является???))

Добавлено через 4 минуты
и еще надо переделать базовый класс??
Цитата Сообщение от Лабутин Виктор Посмотреть сообщение
C#
1
2
3
4
5
6
7
public class A
 {
 public A(A a)
 {
 // Присваиваем значения полям
 }
 }
это тоже самое что перечислять все поля
0
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 3
12.10.2011, 11:38 9
Да перечислять все поля придется, но только 1 раз, а в остальных дочерних классах будешь использовать. А при твоем алгоритме получится, что в каждом дочернем классе придется писать этот конструктор.
0
214 / 214 / 20
Регистрация: 18.05.2010
Сообщений: 860
13.10.2011, 12:55  [ТС] 10
Дело в том что родительский класс создаю не я)) он создается при помощи утилиты Studio, а именно этот класс нечто инное как таблица БД. Использую я его для отображения данных например в гриде( точнее я использую его в WPF) некоторые данные это картинки или не совсем то что в натуральном виде находится у меня в БД. Поэтому если изменится структура БД то я заново генерирую класс, это Linq To SQL Classes. Поэтому нет возможности перечислять в родительском классе.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2011, 12:55
Помогаю со студенческими работами здесь

Объявление наследуемого класса на основе базового
Всем привет. Зашёл в тупик... Возможно ли реализовать в C# следующее: у меня есть базовый...

Вызвать конструктор производного класса без конструктора базового класса
Здравствуйте! У меня есть базовый класс треугольник и производный класс равносторонний...

Как построить экземпляр дочернего класса на основе готового экземпляра базового класса?
Если уже есть готовый объект базового класса. Могу я построить экземпляр дочернего на его основе,...

Конструктор базового класса
Привет, друзья, есть, к примеру, такие классы: class Base { public: int x; Base() { }...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru