Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Помогите с наследованием


Автор: kuller 31.3.2009, 09:06
Здравствуйте!!!

Вот мой код:

Код

    public class Rabotnik
    {
        protected string fio = "";
        protected string specialnost = "";
        protected int razryad = 0;

        public string FIO
        {
            get { return fio; }
            set { fio = value; }
        }

        public string Specialnost
        {
            get { return specialnost; }
            set { specialnost = value; }
        }

        public int Razryad
        {
            get { return razryad; }
            set { razryad = value; }
        }
    }
    public class Brigada : Rabotnik
    {
        private string fio_brigadira = "";
        private string god_rojdeniya = "";
        private string telefon = "";

        public string FIO_BR
        {
            get { return fio_brigadira; }
            set { fio_brigadira = value; }
        }

        public string BirthDate
        {
            get { return god_rojdeniya; }
            set { god_rojdeniya = value; }
        }

        public string Phone
        {
            get { return telefon; }
            set { telefon = value; }
        }
    }


Есть вот класс Rabotnik и его наследник класс Brigada, как мне сделать, чтобы в классе Brigada наследовался типо МАССИВ объектов класса Rabotnik, ну т.е. есть РАБОЧИЙ ОДИН к примеру, и одна БРИГАДА, в которой 10 рабочих!!!!

Помоги пожалуйста это реализовать!
Заранее спасибо!!!

Автор: azesmcar 31.3.2009, 09:13
Цитата

Есть вот класс Rabotnik и его наследник класс Brigada, как мне сделать, чтобы в классе Brigada наследовался типо МАССИВ объектов класса Rabotnik, ну т.е. есть РАБОЧИЙ ОДИН к примеру, и одна БРИГАДА, в которой 10 рабочих!!!!


никак smile
запихни массив работников в один класс и наследуй от него, или делай композицию (т.е. запихни массив рабочих в свой класс)

Автор: kuller 31.3.2009, 09:26
Цитата

запихни массив работников в один класс и наследуй от него



azesmcar, т.е. ИЗНАЧАЛЬНО в классе Rabotnik создать массив, а потом в классе Brigada наследовать класс Rabotnik, тем самым получится что наследую сразу МАССИВ объектов класса Rabotnik????

Автор: azesmcar 31.3.2009, 09:28
Цитата

azesmcar, т.е. ИЗНАЧАЛЬНО в классе Rabotnik создать массив, а потом в классе Brigada наследовать класс Rabotnik, тем самым получится что наследую сразу МАССИВ объектов класса Rabotnik???? 


в принципе получится..но это некрасиво. Зачем должна бригада наследовать от работника?
Создай класс Работник
Создай класс Бригада - содержащий массив работников
вот и все

Автор: kuller 31.3.2009, 09:34
Цитата

Создай класс Работник
Создай класс Бригада - содержащий массив работников
вот и все 



azesmcar, если я сделаю так, то это уже будет ОТНОШЕНИЕ МЕЖДУ КЛАССАМИВЛОЖЕННОСТИ, я так делал ПЕРВУЮ часть этой лабораторной работы, а вот ВТОРАЯ часть предполагает, чтобы мы сделали ТОЖЕ САМОЕ ЗАДАНИЕ , но ОТНОШЕНИЕ МЕЖДУ КЛАССАМИНАСЛЕДОВАНИЕ!!!

Даже не знаю теперь как быть(((

Автор: azesmcar 31.3.2009, 09:38
Цитата

вот ВТОРАЯ часть предполагает, чтобы мы сделали ТОЖЕ САМОЕ ЗАДАНИЕ , но ОТНОШЕНИЕ МЕЖДУ КЛАССАМИ- НАСЛЕДОВАНИЕ!!!


надуманные какие-то задания. ну да ладно, дали - надо решать
сделай класс Работник
сделай класс ГруппаРаботников, храни в нем массив работников
наследуй от класса ГруппаРаботников класс Бригада, добавь соответствующую функциональность

так пойдет?

Автор: kuller 31.3.2009, 09:45
Цитата

сделай класс ГруппаРаботников, храни в нем массив работников
наследуй от класса ГруппаРаботников класс Бригада, добавь соответствующую функциональность

так пойдет? 


думаю что пойдет, но вот в чем дело то еще:

Код

        public Brigada(string a, string b, int c, string d, string e, string f) : base(a, b, c)
        {
            FIO_BR = d;
            BirthDate = e;
            Phone = f;
        }

когда я вызываю конструктор к примеру класса Brigada, то там вот так вот : base(a, b, c) нужно ТИПО передать параметры классу РОДИТЕЛЮ, ну так вот если класс родитель будет СОДЕРЖАТЬ массив полей, то как тогда будет выглядить вот эта часть : base(a, b, c)????

Автор: azesmcar 31.3.2009, 09:51
Цитата

когда я вызываю конструктор к примеру класса Brigada, то там вот так вот : base(a, b, c) нужно ТИПО передать параметры классу РОДИТЕЛЮ, ну так вот если класс родитель будет СОДЕРЖАТЬ массив полей, то как тогда будет выглядить вот эта часть : base(a, b, c)???? 

есть другие способы, но не надо так делать. Примерно что-то вроде этого
Код

class Rabotnik
{
   public Rabotnik() {};
   private string name;
   private int age;
   //итд...
}

class GruppaRabotnikov
{
   public GruppaRabotnikov() {};
   public void AddRabotnik(string name, int age) {};
   public Rabotnik FindRabotnik(string name) {};
   //итд...
}

class Brigada : GruppaRabotnikov
{
   public Brigada() {};
   //итд...
}

Brigada p = new Brigada();
for (...)
   p.AddRabotnik(...);

Автор: kuller 31.3.2009, 09:56
Цитата

Примерно что-то вроде этого

Капец, вот тупое задание!!!!
Блин ладно буду сейчас что то химичить((((


azesmcar, спасибо за идеи!

Автор: kuller 31.3.2009, 10:22
А если я вот решил сделать вот так:

Код

    public class Rabotnik
    {
        public string fio;
        public string specialnost;
        public int razryad;
        public Rabotnik() { }
    }
    public class Gruppa_Rabotnokov
    {
        Rabotnik[] A = new Rabotnik[2];
    }

    public class Brigada: Gruppa_Rabotnokov
    {
        public string fio_brigadira;
        public string god_rojdeniya;
        public string telefon;
        public Brigada() { }
    }
    public class Gruppa_Brigad
    {
        Brigada[] B = new Brigada[2];
    }

    public class Otdel_kadrov: Gruppa_Brigad
    {

    }


у меня тут будеь МАСССИВ из 2-х бригад, в каждой из которых по 2 рабочих!!!

Как мне задать теперь конструктор класса public class Otdel_kadrov: Gruppa_Brigad???

Автор: azesmcar 31.3.2009, 10:28
kuller с классами как в жизни..при проектировании должа быть логика. Разве Отдел кадров это расширенный вариант Бригады? Зачем от него наследовать? Отдел кадров это класс, который занимается принятием на работу - Работников и Конструированием бригады (т.е. распределяет работников по бригадам..я вообще не вижу тут классов которые нужно наследовать). 

А насчет конструктора - сделай функцию которая будет добавлять, а параметры конструктора оставь пустыми

Автор: kuller 31.3.2009, 10:32
azesmcar, Мне преподаватель сказа сделать вот так:

Типо есть ПРЕДПРИЯТИЕ, в нем ЕСТЬ ОТДЕЛ КАДРОВ, хранящий количество БРИГАД, а БРИГАДЫ в свою очередь имеют НАЗВАНИЕ и ФИО_БРИГАДИРА, и также в КАЖДОЙ бригаде есть КАКОЕ-ЛИБО количество работников, которые в свою очередь имеют параметры ФИО, Должность, ну и там год рождения к примеру. Таким образом, мне нужно сделать 3 класса, образующие вот такое вот!!!

Автор: azesmcar 31.3.2009, 10:38
Цитата

Типо есть ПРЕДПРИЯТИЕ, в нем ЕСТЬ ОТДЕЛ КАДРОВ, хранящий количество БРИГАД, а БРИГАДЫ в свою очередь имеют НАЗВАНИЕ и ФИО_БРИГАДИРА, и также в КАЖДОЙ бригаде есть КАКОЕ-ЛИБО количество работников, которые в свою очередь имеют параметры ФИО, Должность, ну и там год рождения к примеру. Таким образом, мне нужно сделать 3 класса, образующие вот такое вот!!! 


не вижу здесь чего-то, что бы указывало на использование наследования..он сказал что надо обязательно наследованием?

Автор: Partizan 31.3.2009, 10:41
kuller

с классом Работник всё должно быть ясно - он элементарен...класс бригада не должен наследовать класс представляющий работника...он должен содержать в себе коллекцию работников

Автор: kuller 31.3.2009, 10:41
Цитата

он сказал что надо обязательно наследованием? 


Да он сказал написать 2 программки:
1 - отношение классов ВЛОЖЕННОСТИ
2 - отношение классов НАСЛЕДОВАНИЕ

блин вот лажа, ничего не выходит((

Пытался вот так сделать, но он ругается (С#):

Код

    public class Rabotnik
    {
        public string fio;
        public string specialnost;
        public int razryad;
        public Rabotnik() { }
    }
    public class Gruppa_Rabotnokov
    {
        Rabotnik[] A = new Rabotnik[2];
        public Gruppa_Rabotnokov(string a1, string a2, int a3, string b1, string b2, int b3)
        {
            A[0].fio=a1;
            A[1].fio=b1;
            A[0].specialnost=a2;
            A[1].specialnost=b2;
            A[0].razryad=a3;
            A[1].razryad=b3;
        }
    }

    public class Brigada: Gruppa_Rabotnokov
    {
        public string fio_brigadira;
        public string god_rojdeniya;
        public string telefon;
        public Brigada(string a1, string a2, int a3, string b1, string b2, int b3)
            : base(a1, a2, a3, b1, b2, b3)
        {
            fio_brigadira = "";
            god_rojdeniya = "";
            telefon = "";
        }
    }
    public class Gruppa_Brigad
    {
        Brigada[] B = new Brigada[2];
        public Gruppa_Brigad(string a1, string a2, int a3, string b1, string b2, int b3, string c1, string c2, string c3, string d1, string d2, string d3)
            : base(a1, a2, a3, b1, b2, b3)
        {
            B[0].fio_brigadira = c1;
            B[1].fio_brigadira = d1;
            B[0].god_rojdeniya = c2;
            B[1].god_rojdeniya = d2;
            B[0].telefon = c3;
            B[1].telefon = d3;
        }
    }

    public class Otdel_kadrov: Gruppa_Brigad
    {
        public int kol_brigad;
        public Otdel_kadrov(string a1, string a2, int a3, string b1, string b2, int b3, string c1, string c2, string c3, string d1, string d2, string d3)
            : base(a1, a2, a3, b1, b2, b3, c1, c2, c3, d1, d2, d3)
        {
            kol_brigad = 2;
        }
    }

Автор: Grok 31.3.2009, 11:45
преподавание все тупее и тупее, разные отношения нужно использовать там где они лучше подходят... 

но как говорится, лаба есть лаба )

держи код 
Код

namespace Laba
{
    class Program
    {
        static void Main(string[] args)
        {
            Brigada First = new Brigada("Vasya Pupkin", "1980", "02");
            First.AddRabotnik(new Rabotnik("velera1", "porno star", 6));
            First.AddRabotnik(new Rabotnik("velera2", "pool cleaner", 5));
            First.AddRabotnik(new Rabotnik("velera3", "pool cleaner", 3));
            Brigada Second = new Brigada("Pupok Vasin", "1900", "03");
            Second.AddRabotnik(new Rabotnik("vasya1", "operator", 6));
            Second.AddRabotnik(new Rabotnik("vasya1", "producer", 5));
            Otdel_kadrov ok = new Otdel_kadrov();
            ok.AddBrigada(First);
            ok.AddBrigada(Second);
            Console.WriteLine(ok.CountBrigad());
        }
    }

    public class Rabotnik
    { 
        public string fio;
        public string specialnost;
        public int razryad;

        public Rabotnik(string f, string s, int r)
        {
            fio = f;
            specialnost = s;
            razryad = r;
        }
    }

    public class Gruppa_Rabotnokov
    {
        ArrayList RabotnikList;
        public Gruppa_Rabotnokov()
        {
            RabotnikList = new ArrayList();    
        }
        public void AddRabotnik(Rabotnik r)
        {
            RabotnikList.Add(r);
        }
    }

    public class Brigada : Gruppa_Rabotnokov
    {
        public string fio_brigadira;
        public string god_rojdeniya;
        public string telefon;
        
        public Brigada(string f, string g, string t)
        {
            fio_brigadira = f;
            god_rojdeniya = g;
            telefon = t;
        }
    }
    public class Gruppa_Brigad
    {
        
        protected ArrayList BrigadaList;
        
        public Gruppa_Brigad()
        {
            BrigadaList = new ArrayList();
        }

        public void AddBrigada(Brigada b)
        {
            BrigadaList.Add(b);
        }
    }

    public class Otdel_kadrov : Gruppa_Brigad
    {
        public int CountBrigad()
        {
            return BrigadaList.Count;
        }
    }
}



только добавишь using System.Collections; для работы с ArrayList

Автор: kuller 31.3.2009, 12:36
Grok, ОГРОМНОЕ СПАСИБО, буду сейчас разбираться!!!!

Добавлено через 13 минут и 51 секунду
А кто может сказать, почему я не могу ОБРАТИТЬСЯ к МЕЛОДУ    public void Print_Rabotniki(), в моем вот ВАРИАНТЕ:

Код

    public class Rabotnik
    {
        public string fio;
        public string specialnost;
        public int razryad;
        public Rabotnik(string x1, string x2, int x3)
        {
            fio = x1;
            specialnost = x2;
            razryad = x3;
        }
    }
    public class Gruppa_Rabotnokov
    {
        Rabotnik[] A = new Rabotnik[2];
        public Gruppa_Rabotnokov(string x1, string x2, int x3)
        {
            A[0] = new Rabotnik(x1, x2, x3);
            A[1] = new Rabotnik(x1, x2, x3);
        }
        public void Vivod_Rabotnikov()
        {
            for (int i = 0; i < A.Length; i++)
            {
                Console.WriteLine("ФИО {0} работника: {1}",i+1,A[i].fio);
                Console.WriteLine("Специальность {0} работника: {1}", i + 1, A[i].specialnost);
                Console.WriteLine("Разряд {0} рабочего: {1}\n", i + 1, A[i].razryad);
            }
            Console.WriteLine("-------------------------------------");
        }
    }

    public class Brigada : Gruppa_Rabotnokov
    {
        public string fio_brigadira;
        public string god_rojdeniya;
        public string telefon;
        public Brigada(string a1, string a2, string a3, string x1,string x2,int x3)
            : base(x1,x2,x3)
        {
            fio_brigadira = a1;
            god_rojdeniya=a2;
            telefon=a3;
        }
        public void Print_Rabotniki()
        {
            Vivod_Rabotnikov();
        }
    }
    public class Gruppa_Brigad
    {
        Brigada[] B = new Brigada[2];
        public Gruppa_Brigad(string a1, string a2, string a3, string b1, string b2, string b3, string e1, string e2, int e3, string f1, string f2, int f3)
        {
            B[0] = new Brigada(a1, a2, a3,e1,e2,e3);
            B[1] = new Brigada(b1, b2, b3,f1,f2,f3);
        }
        public void Print_Brigada()
        {
            for (int i=0;i<B.Length;i++)
            {
                Console.WriteLine("Бригадир {0} бригады: {1}", i + 1, B[i].fio_brigadira);
                Console.WriteLine("Год рождения бригалира {0} бригады: {1}", i + 1, B[i].god_rojdeniya);
                Console.WriteLine("Телефон бригадира {0} бригады: {1}\n", i + 1, B[i].telefon);
            }
        }
    }

    public class Otdel_kadrov:Gruppa_Brigad
    {
        public int kol_brig;
        public Otdel_kadrov(string a1, string a2, string a3, string b1, string b2, string b3, string e1, string e2, int e3, string f1, string f2, int f3, int d)
            : base(a1, a2, a3, b1, b2, b3, e1, e2, e3, f1, f2, f3)
        {
            kol_brig = d;
        }
        public void Vivod()
        {
            Print_Brigada();
        }
    }

Автор: azesmcar 31.3.2009, 12:58
Цитата

А кто может сказать, почему я не могу ОБРАТИТЬСЯ к МЕЛОДУ    public void Print_Rabotniki(), в моем вот ВАРИАНТЕ:


а в чем собственно проблема? опиши поподробнее

Автор: -Mikle- 31.3.2009, 13:03
Ну вот мое представление:

Ну начнем с города, у каждого города есть, название и несколько компаний
Код

public class City
{
    string Name;
    Compnay[] VseCompanii;
}

Каждая компания имеет название и содержит бухгалтерию, отдел кадров, бригады и работников (по хорошему, тут надо сделать список отделов и методы, которые возвращают различные типы отделов, но это пропутим, упростим)
Код

public class Company
{
    string Name;
    OtdelKadrov otdelkadrov;
    Buhgalteriya buhgalteriya;
    Brigada[] vseBrigady;
    Rabotnik[] VseRabotniki;
}

Базовый класс отдел. То есть абсолютно любой отдел имеет название, ссылку на свою компанию, к которой он относится (и в жизни так тоже: отдел работает непосредственно со своей компанией и знает о ней все), у любого отдела есть свой начальник и другие работники.
Код

public class Otdel
{
    Company owner;
    string Name;
    Rabotnik Nachalnik;
    Rabotnik[] rabotniki;
    void PomenyatNachalnika(Rabotnik novyiNachalnik) { }
}

Отдел кадров, бухгалтерия и бригада не имеют отличительных особенностей от отдела, разве что только задачи (методы) у них у всех разные.
Код

public class OtdelKadrov : Otdel
{
    Rabotnik OformitZayavlenie(Chelovek chel) { }
    void PrinyatNaRabotu(Rabotnik rab, Otdel otdel) { }
}

public class Buhgalteriya : Otdel
{
    void VydatZarplatu(Rabotnik rab) { }
}

public class Brigada : Otdel
{
    // не буду конкретезировать класс задание
    void NaznachitZadanie(object zadanie) { }
}

Каждый человек (любой) имеет личные данные, ФИО, День рождения, Родственные связи и т.д.
Код

public class Chelovek
{
    string FIO;
    DateTime BirthDate;
    Chelovek[] Semya;
}

В то же время работник это тоже человек, но с дополнительной информацией о себе: Компания в которой н работает, его рабочий КПД, Должность и т.д.
Код

public class Rabotnik : Chelovek
{
    Company owner;
    string Doljnost;
    float KPD;
}

От класса Chelovek можно сделать наследника Uchenik ну и т.д.

Еще можно вместо базовых класов, сделать интерфейсы. Они позволят еще больше абстрагироваться от конкретики (например задачи отдела кадров, в некоторых предприятиях выполняет бухгалтерия или администрация)

Добавлено через 6 минут и 1 секунду
Здесь есть и наследование и отношения... Вместо массивов нужно использоватьArrayList(как сказали выше) или generic тип List<[ClassName]>.

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

Автор: kuller 31.3.2009, 20:58
-Mikle-, спасибо!!!
Учтем и ВАШЕ мнение!!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)