Структура и состав классов для построения модели работы гостиницы.

Автор работы: Пользователь скрыл имя, 09 Мая 2015 в 17:15, курсовая работа

Описание работы

Темой курсового проекта является моделирование процесса сборки мебели на языке С#. Для реализации поставленной задачи необходимо разработать базовые и производные классы. Также нужно задать для полей и методов классов спецификаторы доступа в зависимости от их использования, построить абстрактные типы данных, сделать перегрузку некоторых методов, задать виртуальные функции, создать обобщённые и необобщённые коллекции, применить исключения, разработать различные конструкторы для объектов.
Данная тема является актуальной на сегодняшний день, так как разработанное приложение поможет организовать процесс работы гостиницы в различных городах.

Содержание работы

Введение...............................................................................................................................5 1 Структура и состав классов для построения модели работы гостиницы.
Инкапсуляция. Применение конструкторов на С#......................................................... 7
1.1 Поля и методы основного и вспомогательного классов............................................7
1.2 Реализация классов на С#............................................................................................ 8
1.3 Примеры использования объектов основного класса Otel и вспомогательного класса Nomer......................................................................................................................11
2 Перегрузка оператора +………………………………………………………………. 13
2.1 Перегрузка оператора + для объектов класса Nomer …………………………….13
2.2 Метод типа void с возвратом результата через параметр ref……………………..15
3 Создание производного класса….................................................................................17
3.1 Производный класс. Модификатор доступа protected и его использование..........17
3.2 Реализация производного класса на С#.....................................................................19
4 Абстрактные классы и виртуальные функции ............................................................23
4.1 Разработка виртуальной функции……………………………………………..........23
4.2 Вызов виртуальной функции…………… .................................................................25
4.3 Разработка абстрактного класса и создание абстрактной функции…………...…27
4.4 Создание статического метода для вспомогательного класса……………………32
5 Применение строк и исключений на языке С#............................................................34
5.1 Класс String в С#, основные методы класса…………………..................................34
5.2 Пример использования методов класса String .........................................................36
5.3 Исключения на языке С#............................................................................................34
6 Создание коллекций…………….…….……………………………………………….39
6.1 Реализация необобщённой коллекции......................................................................39
6.2 Реализация обобщённой коллекции..........................................................................42
Заключение.........................................................................................................................45
Список использованных источников ..............................................................................36
Приложение А....................................................................................................................47
Приложение Б ...................................................................................................................51
Приложение В ...................................................................................................................56
Приложение Г ...................................................................................................................61
Приложение Д....................................................................................................................70
Приложение Е ..................................................................................................................

Файлы: 1 файл

Содержани1.docx

— 511.25 Кб (Скачать файл)

 

            }

        // возвращает  суммарный результат Элемент (e1+e2+e3)

       

            public Nomer SumElem()

            {

                return P1.Add(P2).Add(P3);

 

            }

        //Вычисление  лучшего изделия по суммарной  стоимости элементов 

       public Otel Bet(Otel k, Otel l)

            {

                double r1, r2;

                r1 = k.P1.PrivlekNom() + k.P2.PrivlekNom() + k.P3.PrivlekNom();

                r2 = l.P1.PrivlekNom() + l.P2.PrivlekNom() + l.P3.PrivlekNom();

                if (r1 < r2)

                    return k;

                else

                    return l;

            }

 

     1.3 Примеры использования объектов основного класса Otel и вспомогательного класса Nomer

 

 

     Данный раздел содержит примеры объектов и методов их обработки.

    class Program

        {

            static void Main(string[] args)

            {

                double f;

                Nomer a, b, d;

                a = new Nomer();

                b = new Nomer(20);

                d = new Nomer(12, 14, "номер1");

                a.Init(12, 23, "номер2");

                b.Init(15, 21, "номер3");

                d = a.Add(a, b);

                d = d.Add(a, b);

                d = a.Add(b);

                d = d.Add(b);

                d.Display();

                f = d.PrivlekNom();

                Console.WriteLine("общая стоимость помещений:" + f);

                Otel P1, P2, P3;

                double g1, g2;

                P1 = new Otel();

                P2 = new Otel();

                P3 = new Otel();

                P1.Init("номер1", "номер2", "номер3", 21, 12, 13, 31, 14, 41, 2);

                Console.WriteLine("\nОтель:");

                P1.Display();

                g1 = P1.DpomAg();

                Console.WriteLine("\nДорогое помещение:" + g1);

 

                P2.Init("номер1", "номер2", "номер3", 23, 12, 24, 65, 32, 46, 15);

                Console.WriteLine("\nОтель1: ");

                P2.Display();

                g2 = P2.DpomAg();

                Console.WriteLine("\nДорогое помещение:" + g2);

 

 

                P3 = P3.Bet(P1, P2);

                double s;

                s = P3.SrAg();

                Console.WriteLine("\nСредства Отеля:" + s);

                Nomer e;

                e = P3.SumElem();

                Console.WriteLine("\nCумма: ");

                e.Display();

                Console.ReadKey();

            }

        }

    }

}

 

 

 

 

Результат работы программы представлен на рисунках 1,2:

               

Рисунок 1 – Демонстрация работы программы

Рисунок 2 – Демонстрация работы программы

 

 

 

     2 Перегрузка  оператора +

 

 

     2.1 Перегрузка  оператора + для объектов класса  Nomer

 

 

     Перегрузка оператора — это разновидность вызова метода. Она позволяет переопределить операторы С# для применения их к типам, определенным поль-зователем. Перегрузка операторов связана с одним из важнейших аспектов ООП — абстракцией.

     В данном разделе реализована перегрузка метода класса Nomer, вычисляющего привлекательность номера.

     Ниже приведена программная реализация перегрузки функции вычисления привлекательности номера:

     //Вспомогательный класс

     class Nomer

    {

    

        private int ploshad;

        public void Display()

        {

                stoimost = s;

            ploshad = p;

            name = n;

          }

         …

        //Сложение двух объектов класса Nomer

  public static Nomer operator +(Nomer a, Nomer b)

        {

            Nomer p;

            p = new Nomer();

            p.stoimost = a.stoimost + b.stoimost;

            p.ploshad = a.ploshad + b.ploshad;

            return p;

        }

 

        //Сложение  объекта Nomer и целого числа справа

public static Nomer operator +(Nomer a, int b)

        {

            Nomer p;

            p = new Nomer();

            p.stoimost = a.stoimost;

            p.ploshad = a.ploshad + b / 2;

            return p;

        }

 

        //Сложение  объекта Nomer и числа слева

        public static Nomer operator +(int a, Nomer b)

        {

            Nomer p;

            p = new Nomer();

            p.stoimost = b.stoimost;

            p.ploshad = b.ploshad + a / 2;

            return p;

        }

       

 

     2.2 Метод типа void с возвратом результата через параметр ref

 

 

     Модификатор параметра ref принудительно организует вызов по ссылке, а не по значению. Этот модификатор указывается как при объявлении, так и при вызове метода. Параметры, сопровождаемые таким модификатором, называются ссылочными и применяются, когда нужно позволить методу выполнять операции и обычно также изменять значения различных элементов данных.

 //Возврат значения через параметр

public void PrivlekNom(ref double Rez)

        {

            Rez = stoimost / ploshad;

        }

 …

     Приведём пример работы программы:

    class Program

    {

        static void Main(string[] args)

        {

                double k;

                a.Init(24, 12, "номер4");

                a.Display();

                k = a.PrivlekNom();

                Console.WriteLine("Через return: " + Convert.ToString(k));

                k = 0;

                a.PrivlekNom(ref k);

                Console.WriteLine("Через ref: " + Convert.ToString(k));

            …

        }

    }

}

 

 

 

 

 

 

 

 

 

    Пример работы  программы приведён на рисунке 3:

                         

                           Рисунок 3 – Демонстрация работы программы

 

 

     3 Создание производного класса

 

 

     3.1 Производный класс. Модификатор доступа protected и его использование

 

 

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

     Единственными  членами базового класса, которые  не наследуются производным классом, является деструктор, конструкторы  и любые методы, перегружающие оператор присвоения. Все прочие функции-члены, вместе со всеми переменными-членами базового класса, наследуются производным классом.

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

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

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

     Кроме спецификаторов  доступа public и private, при объявлении  членов класса можно также  использовать спецификатор protected (защищенный). В классе ключевое слово protected обеспечивает тот же эффект, что  и слово private: такие члены класса  могут быть доступны только  методам этого класса и его  дружественным функциям, а также  они доступны методам производного  класса.

     Определим  уровень доступа унаследованных  членов класса при различных  спецификаторах доступа. Если не  указан модификатор доступа базового  класса в определении производного, то по умолчанию принимается private. Эффект от этого заключается  в том, что унаследованные открытые  и защищенные члены базового  класса становятся в производном  классе private и потому не доступны  методам производного класса. Фактически  они остаются private по отношению  к базовому классу, независимо  от того, как указан базовый  класс в определении производного  класса. Если использовать спецификатор public, то это оставляет в силе  спецификации доступа членов  базового класса в производном  классе, так что открытые члены  остаются public, а protected – protected. Если объявить  базовый класс как protected, то это  меняет доступ унаследованных  открытых членов базового класса  на protected в производном классе. Унаследованные  члены с уровнем доступа protected и private сохраняют свою спецификацию  доступа в производном классе.

     Возможность  изменять уровень доступа унаследованных  членов в производном классе  предлагает определенную степень  гибкости, но нужно помнить, что  ослабить уровень, заданный в  базовом классе, нельзя. Можно только  сделать доступ более ограниченным. Это предполагает, что базовый  класс должен объявлять как public те члены, доступ к которым  нужно варьировать в производных  классах. Это может показаться  противоречащим идее инкапсуляции  данных в классе для предотвращения  неавторизованного доступа, но возможно  объявление в подобной манере базовых классов, которые не предназначены для того, чтобы создавать объекты их собственного типа. Единственное назначение таких классов – служить базой для других классов.

 

 

     3.2 Реализация производного класса на C#

 

 

     Объявим производный  класс элемент из драгоценных  металлов (BrookedNomer), взяв за основу класс Nomer. Определим конструктор с параметрами и без параметров, зададим функцию подсчёта общей стоимости изделия по всем обычным элементам и из драгоценных материалов, добавим в основной класс одно поле базового вспомогательного класса и одно поле производного вспомогательного класса.

     …

      //Вспомогательный класс

     class Nomer

 

    {

        protected int ploshad;

        public void Display()

           …

     }

 

    // Производный класс Бронирование номера класса Номер

     class BrookedNomer : Nomer

    {

        private int brook;

       //Определение стоимости элемента с учётом процента примеси

public double PrivlekNom()

        {

            if (brook == 0) return stoimost / ploshad;

            return 0;

        }

       //Перегрузка с вызовом базового класса

public void Init(double s, int p, string n, int b)

        {

            base.Init(s, p, n);

            brook = b;

        }

       //Конструктор без параметров

       public BrookedNomer()

        {

            stoimost = 123;

            ploshad = 12;

            brook = 1;

            name = "номер";

        }

       //Конструктор  с параметрами с вызовом конструктора  базового класса Nomer

public BrookedNomer(double s, int p, string n, int b)

            : base(s, p, n)

        {

            brook = b;

        }

 

Добавление полей в основной класс Otel:

 

//Основной класс Гостиница

class Otel

{

     …

private Nomer P1 = new Nomer();

        private BrookedNomer P2 = new BrookedNomer();

public void Init(string n1, string n2, double s1, int p1, double s2, int p2, int b2, double TZ)

        {

            P1.Init(s1, p1, n1);

            P2.Init(s2, p2, n2, b2);

            TZatraty = TZ;

        }

            …

       }

        //Вычисление  общей стоимости изделия 

  public double DpomAg()

        {

            double x;

            x = P1.PrivlekNom();

            if (x < P2.PrivlekNom())

                x = P2.PrivlekNom();

            return x;

        }

        public double SrAg()

        {

            return P1.PrivlekNom() + P2.PrivlekNom() +  - TZatraty;

        }

 

        public Nomer SumElem()

        {

            return P1 + P2;

         }

public Otel Bet(Otel k, Otel l)

        {

            double r1, r2;

            r1 = k.P1.PrivlekNom() + k.P2.PrivlekNom();

            r2 = l.P1.PrivlekNom() + l.P2.PrivlekNom();

            if (r1 < r2)

                return k;

            else

                return l;

 

        }

   …

 

   Продемонстрируем работу с производным классом:

     class Program

    {

        static void Main(string[] args)

        {

            double z;

            BrookedNomer e = new BrookedNomer();              //конструктор без параметров(производного  класса)

            BrookedNomer e1 = new BrookedNomer(113, 6, "номер1", 2);    //конструктор со всеми  параметрами(производного класса)

            e.Init(112, 8, "номер2", 0);                  //переопределенный метод Init() на  одного человека

            e.Display();

            z = e.PrivlekNom();               //переопределенный метод площади  на одного человека

            Console.WriteLine("Привлекательность номера:" + z);

Информация о работе Структура и состав классов для построения модели работы гостиницы.