Задание 1 Объясните концепцию абстракции, и почему она важна для программной инженерии
Скачать 19.01 Kb.
|
Отчет за 14.06.2021 Изучаемые вопросы. 1. Классы и объекты. 2. Инкапсуляция данных. 3. Наследование и полиморфизм. Задание 1 1. Объясните концепцию абстракции, и почему она важна для программной инженерии? В контексте проектирования программных систем существует два механизма абстракции – параметризация и специфицирование (может интерпретироваться как детализация). При этом, абстракция через специфицирование бывает трех видов: процедурная абстракция (динамическая, то есть в отношении поведения), абстракция данных (статическая, то есть в отношении информации) и абстракция контроля (то есть управления системой и обрабатываемой ею информацией). Обычно под абстракций, как результатом процесса абстракции, понимают модель, упрощающую поставленную проблему до рамок, значимых для заданного контекста. 2. Два принципа инкапсуляции. Инкапсуляция - в информатике размещение в одном компоненте данных и методов, которые с ними работают. Также может означать скрытие внутренней реализации от других компонентов. Например, доступ к скрытой переменной может предоставляться не напрямую, а с помощью методов для чтения (геттер) и изменения (сеттер) её значения. Абстракция Наследование 3. Опишите наследование в контексте ООП. Терминология В объектно-ориентированном программировании, начиная с Simula 67, абстрактные типы данных называются классами. Суперкласс (англ. superclass), родительский класс (англ. parentclass), предок, родитель или надкласс — класс, производящий наследование в подклассах, т. е. класс, от которого наследуются другие классы. Суперклассом может быть подкласс, базовый класс, абстрактный класс и интерфейс. Подкласс (англ. subclass), производный класс (англ. derivedclass), дочерний класс (англ. childclass), класс потомок, класс наследник или класс-реализатор — класс, наследуемый от суперкласса или интерфейса, т. е. класс определённый через наследование от другого класса или нескольких таких классов. Подклассом может быть суперкласс. Базовый класс (англ. baseclass) — это класс, находящийся на вершине иерархии наследования классов и в основании дерева подклассов, т. е. не являющийся подклассом и не имеющий наследований от других суперклассов или интерфейсов. Базовым классом может быть абстрактный класс и интерфейс. Любой не базовый класс является подклассом. Интерфейс (англ. interface) — это структура, определяющая чистый интерфейс класса, состоящий из абстрактных методов. Интерфейсы участвуют в иерархии наследований классов и интерфейсов. Суперинтерфейс (англ. superinterface) или интерфейс-предок — это аналог суперкласса в иерархии наследований, т. е. это интерфейс производящий наследование в подклассах и подинтерфейсах. Интерфейс-потомок, интерфейс-наследник или производный интерфейс (англ. derivedinterface) — это аналог подкласса в иерархии наследований интерфейсов, т. е. это интерфейс наследуемый от одного или нескольких суперинтерфейсов. Базовый интерфейс — это аналог базового класса в иерархии наследований интерфейсов, т. е. это интерфейс, находящийся на вершине иерархии наследования. Иерархия наследования или иерархия классов — дерево, элементами которого являются классы и интерфейсы. 4. Что такое полиморфизм? Как он связан с ранним и поздним связыванием? Полиморфизм — одна из трех основных парадигм ООП. Если говорить кратко, полиморфизм — это способность обьекта использовать методы производного класса, который не существует на момент создания базового. Для тех, кто не особо сведущ в ООП, это, наверно, звучит сложно. Поэтому рассмотрим применение полиморфизма на примере. 5. Опишите разницу между интерфейсами, абстрактными классами и конкретными классами. Короткое различие. Абстрактный класс — это класс, у которого не реализован один или больше методов (некоторые языки требуют такие методы помечать специальными ключевыми словами). Интерфейс — это абстрактный класс, у которого ни один метод не реализован, все они публичные и нет переменных класса. Интерфейс нужен обычно когда описывается только интерфейс (тавтология). Например, один класс хочет дать другому возможность доступа к некоторым своим методам, но не хочет себя «раскрывать». Поэтому он просто реализует интерфейс. Абстрактный класс нужен, когда нужно семейство классов, у которых есть много общего. Конечно, можно применить и интерфейс, но тогда нужно будет писать много идентичного кода. В некоторых языках (С++) специального ключевого слова для обозначения интерфейсов нет. Можно считать, что любой интерфейс — это уже абстрактный класс, но не наоборот. Индивидуальное задание 2 using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { House[] houses = new House[] { new House(9, 1, 4, 54), new House(9, 2, 5, 54), new House(8, 3, 2, 48), new House(12, 4, 3, 72), new House(11, 5, 5, 66), }; foreach (House house in houses) Console.WriteLine(house.ToString()); Console.ReadKey(); } } class House { public int porchCount; public int floorCount; private int roomsOnFloor; private double meterCost; public int Porchs { get { return porchCount; } set { porchCount = value; } } public int Floors { get { return floorCount; } set { floorCount = value; } } public int RoomsOnFloor { get { return roomsOnFloor; } set { roomsOnFloor = value; } } public double Cost { get { return meterCost; } set { meterCost = value; } } public House() { } public House(int porchCount, int floorCount, int roomsOnFloor, double cost) { this.porchCount = porchCount; this.floorCount = floorCount; this.roomsOnFloor = roomsOnFloor; this.meterCost = cost; } public int GetRoomsCountInPorch() { return roomsOnFloor * floorCount; } public int GetRoomsCountInHouse() { return GetRoomsCountInPorch() * porchCount; } public double HouseCost() { return (double)GetRoomsCountInHouse() * Cost; } public override string ToString() { return string.Format("Уникальный номер здания: {0} \nКоличество этажей: {1} \nКоличество квартир: {2}", Floors, Porchs, Cost); } } } |